关于Task.Yield(),
msdn的解释:可以
await Task.Yield();
在异步方法中使用来强制异步完成方法。 如果当前同步上下文 (SynchronizationContext 对象) ,则这会将该方法的其余执行内容发布回该上下文。 但是,上下文将决定如何将此工作的优先级设置为相对于可能挂起的其他工作。 大多数 UI 环境中的 UI 线程上出现的同步上下文通常会将发布到上下文的工作的优先级设置为高于输入和呈现工作的优先级。 出于此原因,请不要依赖await Task.Yield();
于保持 UI 的响应能力。 有关详细信息,请参阅通过 .NET 并行编程中的 System.threading.tasks.task.continuewith 启用的有用抽象 博客。
关键就是红色标注。
这里举个例子:
来自:https://stackoverflow.com/questions/20319769/await-task-yield-and-its-alternatives
static void Main(string[] args) { Task.Run( () => RunAsync()); Console.ReadLine(); } static async Task RunAsync() { Task<Task> task = null; task = getOwnTaskAsync(); var foundTask = await task; Console.WriteLine($"{task?.Id} == {foundTask?.Id}: {task == foundTask}"); async Task<Task> getOwnTaskAsync() { // Cause this method to return and let the 「task」 local be assigned. await Task.Yield(); return task; } }
如果注释await Task.Yield();
结果如下:False
反之:True