2015-05-29 2 views
0

я принял следующий пример из MSDN для постепенного загрузки миниатюр в виде списка в WinRT App:Поэтапно загрузки элементов в ListView

https://code.msdn.microsoft.com/windowsapps/Data-Binding-7b1d67b5

Я хотел бы, чтобы удалить «ждать Task.Delay (10) "ниже. Когда я это сделаю, я получаю предупреждение о том, что методу не хватает оператора ожидания.

protected async override Task<IList<object>> LoadMoreItemsOverrideAsync(System.Threading.CancellationToken c, uint count) 
     { 
      uint toGenerate = System.Math.Min(count, _maxCount - _count); 

      // Wait for work 
      await Task.Delay(10); 

      // This code simply generates 
      var values = from j in Enumerable.Range((int)_count, (int)toGenerate) 
         select (object)_generator(j); 
      _count += toGenerate; 

      return values.ToArray(); 
     } 

Я попытался переписать метод и завернуть весь метод в задаче asfollows:

protected async override Task<IList<object>> LoadMoreItemsOverrideAsync(System.Threading.CancellationToken c, uint count) 
      { 
    return await Task.Run(() => { 
       uint toGenerate = System.Math.Min(count, _maxCount - _count); 

       // This code simply generates 
       var values = from j in Enumerable.Range((int)_count, (int)toGenerate) 
          select (object)_generator(j); 
       _count += toGenerate; 

       return values.ToList<object>(); 
      }); 
} 

Однако я получаю поточное исключение:

Исключения: Приложение называется интерфейс, который был сортировать по другой теме. (Исключение из HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))

Кажется, мне нужно запустить это на тему пользовательского интерфейса? Но у меня нет доступа к Диспетчеру.

В поисках некоторых рекомендаций

+0

Не существует * Вызывать (делегировать) * метод управления? –

ответ

0

Я думаю, что вы ищете не то место. Конечно, я немного вздрагиваю в темноте, но, поскольку остальное выглядит безобидным, в вашем методе _generator(int), скорее всего, нужно запустить поток UI. (Возможно, это не UI-поток per se, но что-то нужно запускать в том же потоке, что и что-то еще. Поскольку вы упоминаете миниатюры, наиболее вероятная причина заключается в том, что у вас есть объект GDI + Graphics, созданный в одном потоке и пытающийся чтобы манипулировать им в другом.)

Мое предложение было бы внимательно изучить ваш метод _generator(int) и сделать его версию async, которая заботится о том, чтобы код работал на правильной нити. Таким образом, инкапсуляция сохраняется, и ваш обратный вызов LoadMoreItemsOverrideAsync не должен ничего понимать о внутренней работе _generator.


В качестве примечания, добавив 10мс задержки почти определенно не правильного действия, если нет какого-то состояние гонки вы активно пытаетесь избежать. (Что означает «ждать работы» в комментарии? Если вы действительно ожидаете работы, разве вы не должны ждать еще одной задачи, а не произвольной 10 мс?)

Предупреждение, которое вы, скорее всего, получаете, является пытаясь сказать вам: «Вы отметили этот метод с ключевым словом async, но ничего об этом не асинхронно. Вы забыли await

Если в качестве последнего средства у вас нет выбора, кроме как запустить код синхронно, сделайте именно это. Поместите здесь комментарий и подтвердите ситуацию, отключив это конкретное предупреждение для этого метода.

Смежные вопросы