Problembeschreibung
.NET Framework 4.6 hinzugefügt Enumerationen TaskCompletionSource und TaskCreationOptions einen neuen Typ Enumerationswert, RunContinuationsAsynchronously. Dieser Wert gezwungen Aufgaben asynchron ausgeführt, und dies hilft, um Deadlocks zu vermeiden. Allerdings wurde ein Problem entdeckt, für einige bestimmten Arten von folgen (insbesondere beim Erstellen von folgen Task.WhenAll, Task.WhenAnyoder TaskExtensions.Unwrap ) die Option ignoriert. Daher können folgen weiterhin synchron ausgeführt.
Das folgende Beispiel veranschaulicht das Problem. Der Wert RunContinuationsAsynchronously ordnungsgemäß funktionieren, wäre zwei Thread-IDs, die ausgedruckt werden nie, da die Fortsetzung immer auf verschiedenen Threads geplant wird.
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();
}
}
Problemlösung
Es gibt keine Abhilfe für dieses Problem. Microsoft.NET Framework-Team arbeitet an einer Lösung in einem zukünftigen Update enthalten.