Если мне нужно отложить выполнение кода до тех пор, после того, как будущая итерации цикла UI поток сообщений, я мог бы сделать так что-то вроде этого:«ждет Task.Yield()» и его альтернативы
await Task.Factory.StartNew(
() => {
MessageBox.Show("Hello!");
},
CancellationToken.None,
TaskCreationOptions.None,
TaskScheduler.FromCurrentSynchronizationContext());
Это было быть похожим на await Task.Yield(); MessageBox.Show("Hello!");
, кроме того, у меня будет возможность отменить задачу, если захочу.
В случае контекста синхронизации по умолчанию я мог бы использовать await Task.Run
для продолжения потока пула.
На самом деле мне нравятся Task.Factory.StartNew
и Task.Run
более Task.Yield
, поскольку они оба явно определяют область действия кода продолжения.
Итак, в каких ситуациях await Task.Yield()
на самом деле полезен?
Я использовал только 'Task.Yield' в модульных тестов и [ для работы над неясной проблемой ASP.NET, где метод 'async' * не должен * завершаться синхронно] (http://stackoverflow.com/q/16653308/263693). –
Связанный: [Task.Yield - реальные обычаи?] (Http://stackoverflow.com/q/23431595/1768303) – Noseratio
Я понимаю, что ваш вопрос не задавал этого вопроса, но это отчасти связано. Вызов 'MessageBox.Show()' без передачи аргумента '' IWin32Window owner' (https://msdn.microsoft.com/en-us/library/cked7698%28v=vs.110%29.aspx) может привести к в случае, если этот код выполняется, когда ваше окно не имеет фокуса, появляется сообщение «popping under» вашего окна.Это особенно смущает, если сделать это в графическом интерфейсе. Кроме того, если вы передаете 'IWin32Window' в' MessageBox.Show() ', вам нужно сделать это в потоке пользовательского интерфейса. Итак, в этом случае вы ** не должны ** использовать 'Task.Run()' и ** должны ** передавать 'TaskScheduler' в' StartNew() '. – binki