await Task.Yield()和await Task.CompletedTask有什么不同
有时候我们在代码中要执行一些非常耗时的操作,我们不希望这些操作阻塞调用线程(主线程)的执行,因为调用线程(主线程)可能还有更重要的工作要做,我们希望将这些非常耗时的操作由另外一个线程去执行,这个时候就可以用到 await Task.Yield() ,它借助了C# 5.0中的异步函数关键字 await async ,将 await 关键字之后的代码交由线程池中的另一个线程执行(前提是项目的SynchronizationContext.Current为null)。 那么有同学肯能会纳闷, await Task.Yield() 和 await Task.CompletedTask 有什么不同吗? 它俩可大不一样 Task.CompletedTask 本质上来说是返回一个 已经完成的 Task对象,所以这时如果我们用 await 关键字去等待 Task.CompletedTask ,.NET Core认为没有必要再去线程池启动一个新的线程来执行 await 关键字之后的代码,所以实际上 await Task.CompletedTask 之前和之后的代码是在同一个线程上同步执行的, 通俗易懂的说就是单线程的 。这也是为什么很多文章说,使用了 await async 关键字并不代表程序就变成异步多线程的了。 而 Task.Yield() 就不一样了,我们可以理解 Task.Yield()