Objawy
.NET Framework 4.6 dodaje nową wartość typu enum, RunContinuationsAsynchronouslydo wyliczenia TaskCompletionSource i TaskCreationOptions . Ta wartość wymusza zadań w celu uruchomienia asynchronicznie, a to pozwala uniknąć sytuacji impasu. Jednak problem zostało ujawnione w przypadku gdy dla niektórych szczególnych rodzajów kontynuacji (w szczególności Task.WhenAll, Task.WhenAnylub TaskExtensions.Unwrap tworzenia kontynuacji) opcja jest ignorowana. W związku z tym kontynuacji może nadal uruchamiane synchronicznie.
Następujący przykład przedstawia ten problem. Jeśli wartość RunContinuationsAsynchronously były działa poprawnie, wątek dwóch identyfikatorów, które są drukowane nigdy nie będzie taka sama, ponieważ kontynuacji będzie zawsze być zaplanowane na różne tematy. 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(); } }Rozwiązanie
Nie ma obecnie nie ma rozwiązania tego problemu. Zespół Microsoft.NET Framework pracuje nad rozwiązaniem do uwzględnienia w przyszłej aktualizacji.