RunContinuationsAsynchronously não pode ser executado continuations modo assíncrono

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática… erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 3118695
Sintomas
O quadro 4.6. .NET adicionado um valor de tipo de enum novo, RunContinuationsAsynchronously, enums de TaskCompletionSource e TaskCreationOptions. Este valor obriga a tarefas para executar de forma assíncrona, e isto ajuda a evitar situações de impasse. No entanto, foi descoberto um problema em que, para alguns tipos específicos de continuations (em especial quandoTask.WhenAll, Task.WhenAnyou TaskExtensions.Unwrapcriar os continuations), a opção é ignorada. Por conseguinte, continuations pode ainda execução síncrona.

O exemplo seguinte mostra o problema. Se o valor de RunContinuationsAsynchronouslyforam funcionar correctamente, o thread de dois IDs são impressos saída nunca seria iguais, uma vez que a continuação será sempre agendada para diferentes 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();    }}

Resolução
Não existe actualmente nenhuma solução para este problema. A equipa da Microsoft de .NET Framework está a trabalhar numa solução para incluir numa actualização futura.


Aviso: Este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 3118695 - Última Revisão: 11/25/2015 05:43:00 - Revisão: 1.0

Microsoft .NET Framework 4.6.1

  • kbsurveynew kbexpertiseadvanced kbtshoot kbmt KB3118695 KbMtpt
Comentários