小编典典

我什么时候使用 Task.Yield()?

all

我正在使用 async/await
等等,Task但从来没有使用过Task.Yield(),老实说,即使有所有的解释,我也不明白为什么我需要这种方法。

有人可以举一个很好的例子Yield()吗?


阅读 114

收藏
2022-04-25

共1个答案

小编典典

当您使用async/await时,不能保证您调用的方法await FooAsync()实际上会异步运行。内部实现可以使用完全同步的路径自由返回。

如果您正在创建一个 API,其中不阻塞并且异步运行一些代码至关重要,并且被调用的方法有可能同步运行(有效阻塞),则使用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.

2022-04-25