我正在使用 async/await 等等,Task但从来没有使用过Task.Yield(),老实说,即使有所有的解释,我也不明白为什么我需要这种方法。
Task
Task.Yield()
有人可以举一个很好的例子Yield()吗?
Yield()
当您使用async/await时,不能保证您调用的方法await FooAsync()实际上会异步运行。内部实现可以使用完全同步的路径自由返回。
async
await
await FooAsync()
如果您正在创建一个 API,其中不阻塞并且异步运行一些代码至关重要,并且被调用的方法有可能同步运行(有效阻塞),则使用await Task.Yield()将强制您的方法异步并返回控制在那个时候。其余代码将稍后在当前上下文中执行(此时,它仍可能同步运行)。
await Task.Yield()
如果您创建需要一些“长时间运行”初始化的异步方法,这也很有用,即:
private async void button_Click(object sender, EventArgs e) { await Task.Yield(); // Make us async right away var data = ExecuteFooOnUIThread(); // This will run on the UI thread at some point later await UseDataAsync(data); }
如果没有Task.Yield()调用,该方法将一直同步执行,直到第一次调用await.