꽤 차이 이해가 안 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
대신 당신이 ASP 컨텍스트를 차단하지 그래서, 모든 작업을 기다리고, 당신은 방법의 반환을 정상적으로 볼 수 있습니다.
Task.Delay(1).Wait()
은 충분히 작동합니다 .