私はasync/awaitをTask
よく使っていますが、タスク.Yield()正直に言うと、すべての説明を聞いても、なぜこの方法が必要なのか理解できません。
必要な良い例を誰か挙げてもらえませんかYield()
?
ベストアンサー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
。