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.

Potrzebujesz dalszej pomocy?

Chcesz uzyskać więcej opcji?

Poznaj korzyści z subskrypcji, przeglądaj kursy szkoleniowe, dowiedz się, jak zabezpieczyć urządzenie i nie tylko.

Społeczności pomagają zadawać i odpowiadać na pytania, przekazywać opinie i słuchać ekspertów z bogatą wiedzą.