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 criar WhenAll, 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 RunContinuationsAsynchronously estava 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 do Microsoft.NET Framework está trabalhando em uma solução para incluir em uma atualização futura.