RunContinuationsAsynchronously no se ejecuta asincrónicamente continuaciones

IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.

Haga clic aquí para ver el artículo original (en inglés): 3118695
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 creanTask.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 RunContinuationsAsynchronouslyse 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 los.NET Framework Microsoft está trabajando en una solución para incluir en una futura actualización.


Advertencia: este artículo se tradujo automáticamente

Propiedades

Id. de artículo: 3118695 - Última revisión: 11/24/2015 18:13:00 - Revisión: 1.0

Microsoft .NET Framework 4.6.1

  • kbsurveynew kbexpertiseadvanced kbtshoot kbmt KB3118695 KbMtes
Comentarios