¿Hay una manera de saber qué tareas se están ejecutando actualmente en la biblioteca de tareas en paralelo?

StackOverflow https://stackoverflow.com/questions/1551537

Pregunta

No puedo ver una manera de ver las tareas que se están ejecutando. Existe la propiedad Task.Current, pero lo que si hay múltiples tareas en ejecución? ¿Hay una manera de obtener este tipo de información?

Como alternativa, hay una construida en la manera de ser notificado cuando se inicia una tarea o completa?

¿Fue útil?

Solución

Hola Mike, no hay manera de acceder pública la lista de tareas pendientes en TPL. El mecanismo que hace que esté disponible para el depurador se basa en el hecho de que todas las discusiones serán congelados en el momento de la enumeración, por lo tanto, no se pueden utilizar en tiempo de ejecución.

Sí, hay una construida en la forma de obtener Whan una tarea completa notificado. Echa un vistazo a las API Task.ContinueWith. Básicamente, esta API crea una nueva tarea que le dispararon cuando la tarea de destino completa.

Estoy asumiendo que usted quiere hacer algo de rápida contabilidad / Información sobre los progresos basa en esto, si ese es el caso, le recomiendo que llame task.ContinueWith () con el indicador TaskContinuationOptions.ExecuteSynchronously. Cuando se especifica que la acción continuación se llevará a cabo allí mismo, en el mismo hilo cuando la tarea de destino termina (si no se especifica esta tarea la continuación se pone en cola como cualquier otra tarea regular).

Espero que esto ayude.

Huseyin

Otros consejos

También puede obtener la tarea actualmente en ejecución (o de sus padres una tarea) con la reflexión:

static public class Extensions
{
    public static Task Parent(this Task t)
    {
        FieldInfo info = typeof(Task).GetField("m_parent", 
            BindingFlags.NonPublic | BindingFlags.Instance);
        return info != null ? (Task)info.GetValue(t) : null;
    }
    public static Task Self
    {
        get
        {
            return Task.Factory.StartNew(
                () => { },
                CancellationToken.None,
                TaskCreationOptions.AttachedToParent,
                TaskScheduler.Default).Parent();
        }
    }
};

Puede crear una clase que deriva de la TaskScheduler proporcionado uno. Dentro de esa clase que tiene el control total y puede agregar el registro a ambos lados de la ejecución. Véase, por ejemplo: http://msdn.microsoft.com/en-us/ biblioteca / ee789351.aspx

También tendrá que utilizar un Taskfactory con una instancia de la clase que el planificador.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top