BidSystem, онлайн-аукцион, проблема со временем

  • Факт 1: GetDataAsync().Result; будет выполняться, когда задача, возвращаемая GetDataAsync(), завершается, тем временем она блокирует поток пользовательского интерфейса
  • Факт 2: продолжение ожидания (return result.ToString() ]) помещается в очередь потока UI для выполнения
  • Факт 3: Задача, возвращаемая GetDataAsync(), будет завершена, когда будет запущено его очередное продолжение
  • Факт 4: Очередное продолжение никогда (факт 1)
  • Тупик!

    Тупик может быть нарушен предоставленными альтернативами, чтобы избежать Факт 1 или Факт 2.

    • Избегайте 1,4. Вместо блокировки потока пользовательского интерфейса используйте var data = await GetDataAsync(), который позволяет потоку пользовательского интерфейса продолжать работать
    • Избегать 2,3. Очередь продолжит ожидание другого потока, который не блокируется, например. используйте var data = Task.Run(GetDataAsync).Result, который выведет продолжение в контекст синхронизации потока threadpool. Это позволяет завершить задачу GetDataAsync().

    Это очень хорошо объясняется в статье Стивена Тууба , примерно наполовину вниз, где он использует пример DelayAsync().

1
задан NotMe 30 September 2010 в 20:56
поделиться