Symptom
.NET Framework 4.6 lagt till en ny typ uppräkningsvärde, RunContinuationsAsynchronously, TaskCompletionSource och TaskCreationOptions -uppräkningar. Det här värdet framtvingar aktiviteter ska köras asynkront och detta hjälper till att undvika dödläge. Dock ett problem upptäcks, för vissa specifika typer av continuations (i synnerhet när skapar continuations Task.WhenAll, Task.WhenAnyeller TaskExtensions.Unwrap ) alternativet ignoreras. Därför kan continuations fortfarande köras synkront.
Följande exempel visar problemet. Om värdet för RunContinuationsAsynchronously fungerar blir de två tråden-ID som skrivs ut aldrig samma, eftersom fortsatta alltid kan schemaläggas på olika trådar.
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();
}
}
Lösning
Det finns för närvarande ingen lösning på problemet. Microsoft.NET Framework-teamet arbetar på en lösning som ska ingå i en framtida uppdatering.