Příznaky
4.6 rozhraní.NET Framework přidána nová hodnota výčtového typu, RunContinuationsAsynchronouslyvýčty TaskCompletionSource a TaskCreationOptions . Tato hodnota vynutí spuštění asynchronní úloh a tímto způsobem se vyhnete zablokování situace. Však problém zjištěno, kde pro některé specifické druhy pokračování (zejména při Task.WhenAll, Task.WhenAnynebo TaskExtensions.Unwrap vytvořit pokračování), možnost je ignorována. Proto pokračování může spustit synchronně.
Následující ukázka znázorňuje problém. Pokud hodnota RunContinuationsAsynchronously byly správně funguje, vlákno dva identifikátory, které jsou vytištěny by nikdy být stejné, protože pokračování by vždy měla být naplánováno na různých podprocesů.
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();
}
}
Řešení
V současné době není žádné řešení tohoto problému. Rozhraní.NET Framework Microsoft team pracuje na řešení k zahrnutí do budoucích aktualizací.