RunContinuationsAsynchronously nelze spustit pokračování asynchronně

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í.


Potřebujete další pomoc?

Rozšiřte své znalosti a dovednosti
Projít školení
Získejte nové funkce jako první
Připojit se k programu Microsoft Insider

Byly tyto informace užitečné?

Děkujeme za váš názor!

Děkujeme vám za váš názor! Pravděpodobně bude užitečné, když vás spojíme s některým z našich agentů podpory Office.

×