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 quando Task.WhenAll, Task.WhenAnyou TaskExtensions.Unwrap criar 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 RunContinuationsAsynchronously foram 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 do Microsoft .NET Framework está a trabalhar numa solução para incluir numa actualização futura.