증상
.NET Framework 4.6 TaskCompletionSource 및 TaskCreationOptions 열거형을 RunContinuationsAsynchronously새 enum 형식 값을 추가합니다. 이 값이 작업이 비동기적으로 실행 하 고 이렇게 하면 교착 상태 상황을 방지 합니다. 그러나 문제가 발견 된 위치를 일부 특정 종류 ( Task.WhenAll, Task.WhenAny또는 TaskExtensions.Unwrap 는 연속 작업을 만들 때에 특히)에 연속의 옵션이 무시 됩니다. 따라서 연속 동기적으로 실행할 수 수 있습니다.
다음 샘플에서는 문제를 보여 줍니다. RunContinuationsAsynchronously 값은 제대로 작동 하는 경우 두 스레드 Id를 출력 하는 것 같을 수는 없습니다, 항상에 서로 다른 스레드에서 연속 작업이 예약을 하기 때문에. using System;using System.Threading; using System.Threading.Tasks; class Program { static void Main() { var mres = new ManualResetEventSlim(); Console.WriteLine(Environment.CurrentManagedThreadId); var tcs = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously); var t = Task.WhenAll(tcs.Task); t.ContinueWith(delegate { Console.WriteLine(Environment.CurrentManagedThreadId); mres.Set(); }, TaskContinuationOptions.ExecuteSynchronously); tcs.SetResult(true); mres.Wait(); } }해결 방법
현재이 문제에 대 한 해결 방법은.입니다. Microsoft.NET Framework 팀은 향후 업데이트에 포함 된 솔루션에서 작동 합니다.