Существует ли «стандартный» способ указать, что продолжение задачи должно выполняться в потоке, из которого была создана первоначальная задача?
В настоящее время у меня есть код ниже - он работает, но отслеживание диспетчера и создание второго действия кажется ненужными накладными расходами.
dispatcher = Dispatcher.CurrentDispatcher;
Task task = Task.Factory.StartNew(() =>
{
DoLongRunningWork();
});
Task UITask= task.ContinueWith(() =>
{
dispatcher.Invoke(new Action(() =>
{
this.TextBlock1.Text = "Complete";
}
});
Control.Invoke(Action)
, т.е.TextBlock1.Invoke
а неdispatcher.Invoke
Ответы:
Назовите продолжение с
TaskScheduler.FromCurrentSynchronizationContext()
:Это подходит, только если текущий контекст выполнения находится в потоке пользовательского интерфейса.
источник
await
хороший шаблон - но только если вы находитесь внутриasync
контекста (такого как объявленный методasync
). Если нет, то все равно необходимо сделать что-то вроде этого ответа.С помощью async вы просто делаете:
Тем не мение:
источник
false
версии меня смущает. Я думал,false
значит, это может продолжаться в другом потоке.async
метода (который необходим, чтобы использоватьawait
). Какой ответ, когдаawait
нет в наличии?Если у вас есть возвращаемое значение, которое вам нужно отправить в пользовательский интерфейс, вы можете использовать общую версию, например:
В моем случае это вызывается из MVVM ViewModel.
источник
Я просто хотел добавить эту версию, потому что это такая полезная тема, и я думаю, что это очень простая реализация. Я использовал это несколько раз в различных типах многопоточных приложений:
источник
TaskScheduler
является частью BCL, аDispatcher
не является им) и может использоваться для составления сложных цепочек задач из-за того, что не нужно беспокоиться о каких-либо асинхронных операциях запуска и забывания (таких какBeginInvoke
).Получил здесь через Google, потому что я искал хороший способ сделать вещи в потоке пользовательского интерфейса после того, как был внутри вызова Task.Run - Используя следующий код, который вы можете использовать
await
чтобы снова вернуться в пользовательского интерфейса.Я надеюсь, что это поможет кому-то.
Использование:
источник
static
классUI
.