Frage

Ich kann nicht einen Weg finden, um zu sehen, welche Aufgaben ausgeführt werden. Es ist die Task.Current Eigenschaft, aber was, wenn es ausgeführt wird, mehrere Aufgaben? Gibt es eine Möglichkeit, diese Art von Informationen zu bekommen?

Alternativ gibt es eine eingebaute Möglichkeit, informiert werden, wenn eine Aufgabe beginnt oder abgeschlossen ist?

War es hilfreich?

Lösung

Hey Mike, gibt es keinen öffentlichen Weg, um die Liste der anstehenden Aufgaben in TPL zuzugreifen. Der Mechanismus, der es für den Debugger macht beruht auf der Tatsache, dass alle Fäden bei Aufzählung der Zeit eingefroren werden, und kann daher nicht zur Laufzeit verwendet werden.

Ja, es gibt eine in Art und Weise gebaut, um informiert whan eine Aufgabe abgeschlossen ist. Überprüfen Sie die Task.ContinueWith APIs aus. Grundsätzlich ist diese API erstellt eine neue Aufgabe das wird gefeuert, wenn die Zielaufgabe abgeschlossen ist.

Ich nehme an, Sie einige schnelle Buchhaltung / Fortschrittsberichte basierend auf dies tun wollen, wenn das der Fall ist, würde ich empfehlen, dass Sie task.ContinueWith () aufrufen, mit der TaskContinuationOptions.ExecuteSynchronously Flagge. Wenn Sie angeben, dass die Fortsetzung Aktion wird genau dort auf dem gleichen Thread ausgeführt werden, wenn die Zielaufgabe beendet (wenn Sie diese Aufgabe der Fortsetzung nicht angeben wird wie jede andere normale Aufgabe in der Warteschlange nach oben).

Hope, das hilft.

Huseyin

Andere Tipps

Sie können auch die aktuell ausgeführte Aufgabe bekommen (oder eines Elternteils Aufgabe) mit Reflexion:

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

Sie können eine TaskScheduler Klasse erstellen aus dem bereitgestellten ein abzuleiten. Innerhalb dieser Klasse haben Sie die volle Kontrolle und fügen Sie können auf beiden Seiten der Ausführung anzumelden. Siehe zum Beispiel: http://msdn.microsoft.com/en-us/ Bibliothek / ee789351.aspx

Sie finden auch eine Taskfactory mit einer Instanz der Klasse, die als Scheduler verwenden müssen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top