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