Požymiai
.NET Framework 4.6 įtraukta nauja išvardijimo tipo reikšmė, RunContinuationsAsynchronously, TaskCompletionSource ir TaskCreationOptions enum. Ši reikšmė priverčia užduotis paleisti asynchronicznie, o tai padeda išvengti aklavietė situacijų. Tačiau problema buvo aptikta, konkrečių rūšių pratęsimą (visų pirma, kai Task.WhenAll, Task.WhenAnyarba TaskExtensions.Unwrap sukurti ir pratęsimą), kad nepaisoma. Todėl pratęsimą gali paleisti sinchroniškai.
Šis pavyzdys rodo, kad problema. Jei reikšmė RunContinuationsAsynchronously veikia tinkamai, du gija ID, kurie yra išspausdinti niekada bus toks pat, nes tęsti visada suplanuoti į skirtingas temas.
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();
}
}
Sprendimas
Šiuo metu yra šios problemos sprendimo nėra. Microsoft .NET Framework komandos dirba sprendimą įtraukti į ateityje atnaujinti.