C'è un modo per dire che le attività sono attualmente in esecuzione in libreria Task Parallel?

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

Domanda

Non riesco a vedere un modo per vedere quali attività sono in esecuzione. C'è la proprietà Task.Current, ma cosa succede se ci sono più attività in esecuzione? C'è un modo per ottenere questo tipo di informazioni?

In alternativa, c'è un costruito in modo per essere avvisato quando un compito avvia o completa?

È stato utile?

Soluzione

Ciao Mike, non c'è modo di accedere pubblica l'elenco delle attività in sospeso in TPL. Il meccanismo che rende disponibile per il debugger si basa sul fatto che tutti i fili vengano congelati a tempo di enumerazione, pertanto non possono essere utilizzate in fase di esecuzione.

Sì, c'è una costruito nel modo per ottenere whan un compito completa notificato. Scopri le API Task.ContinueWith. Fondamentalmente questa API crea un nuovo compito che sparato quando l'operazione viene completata bersaglio.

Ti sto assumendo vuole fare qualche rapido contabilità / progresso segnalazione basato su questo, se questo è il caso, mi consiglia di chiamare task.ContinueWith () con il flag TaskContinuationOptions.ExecuteSynchronously. Quando si specifica che l'azione prosecuzione verrà eseguito proprio lì sullo stesso thread in cui l'attività di destinazione termina (se non si specifica questo compito la continuazione è in coda in su come ogni altro compito regolare).

Spero che questo aiuti.

Huseyin

Altri suggerimenti

È anche possibile ottenere il compito attualmente in esecuzione (o il genitore di una task) con la riflessione:

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();
        }
    }
};

È possibile creare una classe TaskScheduler derivante dal previsto uno. In questa classe si ha il pieno controllo e la possibile aggiungere la registrazione entrambi i lati della esecuzione. Si veda ad esempio: http://msdn.microsoft.com/en-us/ biblioteca / ee789351.aspx

Avrete anche bisogno di utilizzare un Taskfactory con un'istanza della classe come lo scheduler.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top