RunContinuationsAsynchronously não é executado continuações assincronamente

IMPORTANTE: Este artigo foi traduzido pelo software de tradução automática da Microsoft e eventualmente pode ter sido editado pela Microsoft Community através da tecnologia Community Translation Framework (CTF) ou por um tradutor profissional. A Microsoft oferece artigos traduzidos automaticamente por software, por tradutores profissionais e editados pela comunidade para que você tenha acesso a todos os artigos de nossa Base de Conhecimento em diversos idiomas. No entanto, um artigo traduzido pode conter erros de vocabulário, sintaxe e/ou gramática. A Microsoft não é responsável por qualquer inexatidão, erro ou dano causado por qualquer tradução imprecisa do conteúdo ou por seu uso pelos nossos clientes.

Clique aqui para ver a versão em Inglês deste artigo: 3118695
Sintomas
O.NET Framework 4.6 adicionado um novo valor de tipo enum, RunContinuationsAsynchronously, para enums TaskCompletionSource e TaskCreationOptions. Este valor força tarefas para serem executadas de forma assíncrona e isso ajuda a evitar situações de bloqueio. No entanto, foi descoberto um problema em que, para alguns tipos específicos de continuação (em particular quando a continuação de criarWhenAll, Task.WhenAnyou TaskExtensions.Unwrap), a opção será ignorada. Portanto, continuação pode ainda executados de forma síncrona.

O exemplo a seguir mostra o problema. Se o valor de RunContinuationsAsynchronouslyestava funcionando corretamente, o segmento de duas identificações são impressos nunca seria o mesmo, pois a continuação sempre deve ser agendada em threads diferentes.

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
No momento, não há nenhuma solução alternativa para esse problema. A equipe da Microsoft de.NET Framework está trabalhando em uma solução para incluir em uma atualizaçã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