Síntomas
La 4.6 de.NET Framework, se agrega un nuevo valor de tipo enum, RunContinuationsAsynchronously, a las enumeraciones TaskCompletionSource y TaskCreationOptions . Este valor obliga a las tareas se ejecuten de forma asincrónica y, esto ayuda a evitar situaciones de interbloqueo. Sin embargo, se ha descubierto un problema donde, para algunos tipos específicos de continuaciones (en particular cuando las continuaciones se crean Task.WhenAll, Task.WhenAnyo TaskExtensions.Unwrap ), se omitirá la opción. Por lo tanto, las continuaciones aún ejecutan sincrónicamente.
El ejemplo siguiente muestra el problema. Si el valor de RunContinuationsAsynchronously se funciona correctamente, los identificadores que se imprimen fuera de subproceso dos nunca sería el mismo, ya que siempre se debería programar la continuación en subprocesos 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();
}
}
Solución
Actualmente no hay ninguna solución para este problema. El equipo de Microsoft.NET Framework está trabajando en una solución para incluir en una futura actualización.