Objawy

.NET Framework 4.6 dodaje nową wartość typu enum, RunContinuationsAsynchronouslydo wyliczenia TaskCompletionSource i TaskCreationOptions . Ta wartość wymusza zadań w celu uruchomienia asynchronicznie, a to pozwala uniknąć sytuacji impasu. Jednak problem zostało ujawnione w przypadku gdy dla niektórych szczególnych rodzajów kontynuacji (w szczególności Task.WhenAll, Task.WhenAnylub TaskExtensions.Unwrap tworzenia kontynuacji) opcja jest ignorowana. W związku z tym kontynuacji może nadal uruchamiane synchronicznie.

Następujący przykład przedstawia ten problem. Jeśli wartość RunContinuationsAsynchronously były działa poprawnie, wątek dwóch identyfikatorów, które są drukowane nigdy nie będzie taka sama, ponieważ kontynuacji będzie zawsze być zaplanowane na różne tematy.

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();
}
}

Rozwiązanie

Nie ma obecnie nie ma rozwiązania tego problemu. Zespół Microsoft.NET Framework pracuje nad rozwiązaniem do uwzględnienia w przyszłej aktualizacji.


Potrzebna dalsza pomoc?

Rozwijaj swoje umiejętności
Poznaj szkolenia
Uzyskuj nowe funkcje w pierwszej kolejności
Dołącz do niejawnych testerów firmy Microsoft

Czy te informacje były pomocne?

Jaka jest jakość języka?
Co wpłynęło na Twoje wrażenia?

Dziękujemy za opinię!

×