1

このコードは実際に何をしますか?

public async Task Foo()
{
}

Fooではないためawait、同期的に実行されるという警告が表示されます。とまったく同じpublic void Foo()ですか?を返すことは有効なのにTask、実際に作成して返さないのはなぜですか?

同様に、次は何をしますか?

public async Task Foo()
{
    await SomeOtherAsyncFn();
}
4

1 に答える 1

8

を記述する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().

于 2013-10-29T19:31:31.220 に答える