Если мне нужно отложить выполнение кода до следующей итерации цикла сообщений потока пользовательского интерфейса, я мог бы сделать что-то вроде этого:
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()
действительно полезен?