Príznaky
.NET Framework 4.6 pridať novú hodnotu typu enum, RunContinuationsAsynchronouslyenums TaskCompletionSource a TaskCreationOptions . Táto hodnota sily úloh spustiť asynchrónne a pomáha zabrániť zablokovaniu situácie. Však bol zistil problém, keď niektoré špecifické pokračovaním (predovšetkým pri Task.WhenAlla Task.WhenAny TaskExtensions.Unwrap vytvorte pokračovaním), možnosť sa bude ignorovať. Preto pokračovaním môže spustiť synchrónne.
Nasledujúci príklad ukazuje problém. Ak hodnota RunContinuationsAsynchronously fungujú správne, dva vlákno ID, ktoré sa vytlačí nikdy bude, pretože pokračovanie by sa vždy naplánovaná do iného vlákna.
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();
}
}
Riešenie
V súčasnosti neexistuje žiadne alternatívne riešenie tohto problému. Microsoft .NET Framework tím pracuje na riešenie v budúcnosti aktualizovať.