RunContinuationsAsynchronously kjører ikke continuations asynkront

VIKTIG: Denne artikkelen ble oversatt med maskinoversettelsesprogramvare fra Microsoft og muligens redigert av Microsoft Community via CTF-teknologi i stedet for av en oversetter. Microsoft tilbyr både menneskelig oversatte og maskinoversatte/Community-redigerte artikler, slik at du får tilgang til alle artiklene i vår Knowledge Base på ditt eget språk. En maskinoversatt eller Community-redigert artikkel er imidlertid ikke alltid perfekt. Den kan inneholde feil i vokabular, syntaks eller grammatikk, mye likt en fremmedspråklig som forsøker å snakke språket ditt. Microsoft har ikke ansvar for unøyaktige opplysninger, feil eller skade forårsaket av feilaktig oversettelse av innholdet eller kundenes bruk av informasjonen. Microsoft oppdaterer jevnlig maskinoversettelsesprogramvaren og -verktøyene for å forbedre redigering av maskinoversatte tekster.

Den engelske versjonen av denne artikkelen er den følgende: 3118695
Symptom
.NET Framework 4.6 lagt til en ny type opplistingsverdi, RunContinuationsAsynchronously, TaskCompletionSource og TaskCreationOptions-enumeratorer. Denne verdien tvinger oppgaver skal kjøres asynkront, og dette bidrar til å unngå situasjoner i vranglås. Imidlertid er oppdaget et problem der, for noen bestemte typer continuations (i bestemt når du oppretter continuationsTask.WhenAll, Task.WhenAnyeller TaskExtensions.Unwrap), alternativet ignoreres. Derfor av continuations kan fortsatt kjøre synkront.

Følgende eksempel viser problemet. Hvis RunContinuationsAsynchronously-verdi ble fungerer som skal, vil to tråden IDer som skrives ut aldri være den samme, fordi løpende vil alltid bli planlagt på forskjellige tråder.

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

Løsning
Det finnes for øyeblikket ingen løsning for dette problemet. Microsoft for .NET Framework-teamet arbeider med en løsning som skal inkluderes i en fremtidig oppdatering.


Advarsel: Denne artikkelen er autooversatt

Egenskaper

Artikkel-ID: 3118695 – Forrige gjennomgang: 11/25/2015 03:50:00 – Revisjon: 1.0

Microsoft .NET Framework 4.6.1

  • kbsurveynew kbexpertiseadvanced kbtshoot kbmt KB3118695 KbMtno
Tilbakemelding