私はかなりの違いを理解していないTask.Wait
としますawait
。
ASP.NET WebAPIサービスには、次のような機能があります。
public class TestController : ApiController
{
public static async Task<string> Foo()
{
await Task.Delay(1).ConfigureAwait(false);
return "";
}
public async static Task<string> Bar()
{
return await Foo();
}
public async static Task<string> Ros()
{
return await Bar();
}
// GET api/test
public IEnumerable<string> Get()
{
Task.WaitAll(Enumerable.Range(0, 10).Select(x => Ros()).ToArray());
return new string[] { "value1", "value2" }; // This will never execute
}
}
どこでGet
デッドロックします。
何が原因でしょうか?ブロッキング待機ではなく、これを使用すると問題が発生しないのはなぜawait Task.Delay
ですか?
Task.Delay(1).Wait()
基本的にはとまったく同じですThread.Sleep(1000)
。実際の製品コードではめったに適切ではありません。
WaitAll
がデッドロックを引き起こしています。詳細については、回答のブログへのリンクを参照してください。await Task.WhenAll
代わりに使用する必要があります。
ConfigureAwait(false)
Bar
Ros
await Task.WhenAll
Task.Delay(1).Wait()
これで十分です。