Symptomer
.NET Framework 4.6 lagt til en ny type opplistingsverdi, RunContinuationsAsynchronously, TaskCompletionSource og TaskCreationOptions -enumeratorer. Denne verdien tvinger oppgaver skal kjøres asynkront, og dette bidrar til å unngå situasjoner i vranglås. Imidlertid er oppdaget et problem der, for noen bestemte typer continuations (i bestemt når du oppretter continuations Task.WhenAll, Task.WhenAnyeller TaskExtensions.Unwrap ), alternativet ignoreres. Derfor av continuations kan fortsatt kjøre synkront.
Følgende eksempel viser problemet. Hvis RunContinuationsAsynchronously -verdi ble fungerer som skal, vil to tråden IDer som skrives ut aldri være den samme, fordi løpende vil alltid bli planlagt på forskjellige tråder.
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();
}
}
Oppløsning
Det finnes for øyeblikket ingen løsning for dette problemet. Microsoft .NET Framework-teamet arbeider med en løsning som skal inkluderes i en fremtidig oppdatering.