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.