Symptomen
Een nieuw type opsommingswaarde, RunContinuationsAsynchronously, de .NET Framework 4.6 toegevoegd aan de TaskCompletionSource en TaskCreationOptions -enums. Deze waarde zorgt ervoor dat taken worden asynchroon uitgevoerd en dit helpt om impasse situaties te vermijden. Echter een probleem ontdekt wanneer de optie wordt genegeerd voor bepaalde specifieke soorten doorloopt (met name als Task.WhenAll, Task.WhenAnyof TaskExtensions.Unwrap maakt de doorloopt). Daarom kunnen doorloopt steeds synchroon uitgevoerd.
In het volgende voorbeeld ziet u het probleem. Als de waarde van de RunContinuationsAsynchronously zijn goed, zou de twee thread-id's die worden afgedrukt nooit hetzelfde zijn, omdat de voortzetting zou altijd gepland op verschillende threads.
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();
}
}
Oplossing
Er is momenteel geen oplossing voor dit probleem. Het team van Microsoft .NET Framework werkt aan een oplossing op te nemen in een toekomstige update.