Sümptomid
.NET Frameworki 4.6 lisatud uus enum tippige väärtus, RunContinuationsAsynchronously TaskCompletionSource ja TaskCreationOptions variandid. See väärtus sunnib ülesanded käivitada asünkroonselt ja see aitab vältida tupik. Siiski on avastatud probleem, kus mõned teatud tüüpi põhiuuringute jätku (eriti kui Task.WhenAll, Task.WhenAnyvõi TaskExtensions.Unwrap luua selle põhiuuringute jätku) võimalust ignoreeritakse. Seetõttu põhiuuringute jätku endiselt töötada sünkroonselt.
Järgmine näide näitab probleemi. RunContinuationsAsynchronously väärtus ei tööta korralikult, kaks jutulõnga ID-ga välja printida kunagi oleks sama, sest jätkamine oleks alati ajastatud peale erinevad teemad.
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();
}
}
Lahendus
Praegu pole sellele probleemile pole vastukaalu. Microsoft .NET Frameworki meeskonna lahendus lisada tulevikus värskendust.