このコードは実際に何をしますか?
public async Task Foo()
{
}
Foo
ではないためawait
、同期的に実行されるという警告が表示されます。とまったく同じpublic void Foo()
ですか?を返すことは有効なのにTask
、実際に作成して返さないのはなぜですか?
同様に、次は何をしますか?
public async Task Foo()
{
await SomeOtherAsyncFn();
}
このコードは実際に何をしますか?
public async Task Foo()
{
}
Foo
ではないためawait
、同期的に実行されるという警告が表示されます。とまったく同じpublic void Foo()
ですか?を返すことは有効なのにTask
、実際に作成して返さないのはなぜですか?
同様に、次は何をしますか?
public async Task Foo()
{
await SomeOtherAsyncFn();
}
を記述するpublic async Task Foo() {}
と、コンパイラは実際に処理を進め、状態のないステート マシンを作成しますTask
。目的を果たさない余分なオーバーヘッドがたくさんあるため、これを回避するためにコンパイラの警告が用意されています。
次のように書く方がはるかに簡単/効率的です。
public Task Foo()
{
return Task.FromResult(true);
}
これにより、同じ API がより簡単な方法で提供されます。
同様に、次は何をしますか?
public async Task Foo() { await SomeOtherAsyncFn(); }
これにより、コンパイラは を返すステート マシンを作成しますTask
。を呼び出すとすぐに呼び出さSomeOtherAsyncFn
れますFoo()
。返されたものは、終了Task
するとすぐに完了とマークされSomeOtherAsyncFn()
ます。この場合、ステート マシンは例外のバブリングもTask
適切に処理するため、SomeOtherAsyncFn()
.