Симптоми
.NET Framework 4.6 добавена нова enum тип RunContinuationsAsynchronouslyза TaskCompletionSource и TaskCreationOptions enums. Тази стойност кара задачи да се изпълняват асинхронно и това помага да се избегне блокиране ситуации. Обаче е открил проблем, за някои конкретни видове удължаване (по-специално Task.WhenAll, Task.WhenAnyили TaskExtensions.Unwrap създадете удължаване), опцията се игнорира. Затова удължаване все още могат да изпълняват синхронно.
Следният примерен показва проблема. Ако стойността на RunContinuationsAsynchronously са функционира правилно, две нишка идентификатори, които се отпечатват, никога няма да бъде същата, защото продължаването винаги ще бъде планирана върху различни теми.
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 работи върху решение за включване в бъдеща актуализация.