RunContinuationsAsynchronously doorloopt niet asynchroon uitgevoerd

BELANGRIJK: Dit artikel is vertaald door middel van automatische vertalingssoftware van Microsoft en is mogelijk nabewerkt door de Microsoft Community via CTF-technologie (Community Translation Framework) of door een menselijke vertaler. Microsoft biedt zowel automatisch vertaalde, door mensen vertaalde en door de community nabewerkte artikelen aan, zodat er in meerdere talen toegang is tot alle artikelen in onze Knowledge Base. Een vertaald of bewerkt artikel kan fouten bevatten in vocabulaire, syntaxis of grammatica.. Microsoft is niet verantwoordelijk voor eventuele onjuistheden, fouten of schade ten gevolge van een foute vertaling van de inhoud van een bericht of het gebruik van deze vertaalde berichten door onze klanten.

De Engelstalige versie van dit artikel is de volgende: 3118695
Symptomen
Een nieuw type opsommingswaarde, RunContinuationsAsynchronously, de .NET Framework-4.6 toegevoegd aan de TaskCompletionSource en TaskCreationOptions-enums. Deze waarde zorgt ervoor dat taken worden asynchroon uitgevoerd en dit helpt om impasse situaties te vermijden. Echter een probleem ontdekt wanneer de optie voor bepaalde specifieke soorten doorloopt (met name alsTask.WhenAll, Task.WhenAnyof TaskExtensions.Unwrapmaakt de doorloopt) wordt genegeerd. Daarom kunnen doorloopt nog steeds synchroon uitgevoerd.

In het volgende voorbeeld ziet u het probleem. Als de waarde RunContinuationsAsynchronouslygoed zijn zou de twee thread-id's die worden afgedrukt nooit hetzelfde zijn, omdat de voortzetting zou altijd gepland op verschillende threads.

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

Oplossing
Er is momenteel geen oplossing voor dit probleem. Het team van .NET in Microsoft Framework werkt aan een oplossing op te nemen in een toekomstige update.


Waarschuwing: dit artikel is automatisch vertaald

Eigenschappen

Artikel-id: 3118695 - Laatst bijgewerkt: 11/25/2015 03:50:00 - Revisie: 1.0

Microsoft .NET Framework 4.6.1

  • kbsurveynew kbexpertiseadvanced kbtshoot kbmt KB3118695 KbMtnl
Feedback