Verfolgen c # /. NET Aufgaben fließen

8

Ich versuche einen Weg zu finden, den Ausführungsablauf von asynchronen Tasks so zu verfolgen, dass es in Bezug auf die Task einfach zu verstehen ist, was der ursprüngliche Fluss war, der sie ausgelöst hat.

Ich brauche es hauptsächlich zum Loggen, Debuggen und Aufbewahren einer Art Stack-Trace für einen bestimmten Ausführungsablauf.

zum Beispiel: wenn ich einen Server mit vielen Clients von mehreren IPs habe und der Server dies tun muss Ausführen eines Arbeitsablaufs für jeden Client, der viele asynchrone Aktionen beinhaltet, umfasst somit viele verschiedene Aufgaben pro Ausführungsablauf; Das Protokollieren eines solchen Flusses ist schwierig, insbesondere wenn Async- / Avail-Mechanismen verwendet werden.

Ich habe keine Möglichkeit gefunden, die Aufgaben so zu verpacken, dass ich für jede ausgeführte Aufgabe die anfängliche Ablaufbeschreibung bei der Protokollierung kennen würde, zum Beispiel wenn ich einen neuen Ablauf von Aufgaben für eine Aktion mit Beschreibung starte - "Ich kümmere mich um 10.0.3.4 client" Ich möchte in der Lage sein, diese Beschreibung für jedes Protokollelement hinzuzufügen, das aus diesem Fluss in einer beliebigen Aufgabe kommt, die daraus erstellt wurde.

Bei der Verwendung von Threads ist es einfach, weil Sie statische Thread-Variablen haben. mit Aufgaben ist es unmöglich ... Ich habe sogar versucht, meinen eigenen Aufgabenplaner zu erstellen, der jede Aufgabe, die ihn verwendet, umschließt (selbst wenn Async / Abwarten-Methoden verwendet werden), aber in eine Sackgasse kam, weil die Taskplanerbasis manchmal neuen Thread verwendet (obwohl es keinen gab) implizite Anforderung, einen neuen Thread zu verwenden) - die Methode "TryExecuteTaskInline" kann manchmal in einem neuen Thread ausgeführt werden.

Irgendeine Idee oder Vorschlag, wie kann ich das erreichen?

    
ThaPhoeniX 28.06.2014, 16:38
quelle

2 Antworten

11

Sie können Trace.CorrelationManager.ActivityId um eine logische Operations-ID zu speichern, oder noch besser speichern Sie eine ImmutableStack von logischen Operations-IDs. Es ist in der CallContext gespeichert und wird kopiert Die Methode async ruft auf:

%Vor%

Sie können es als IDisposable verwenden, damit Sie einen using -Bereich verwenden können, um sicherzustellen, dass% Pop für jedes Push :

vorhanden ist %Vor%

Verwendung:

%Vor%

Diese Antwort basierte bisher auf Trace.CorrelationManager.LogicalOperationStack , aber Ist LogicalOperationStack mit async in .Net 4.5 inkompatibel

>     
i3arnon 28.06.2014, 16:48
quelle
2

Mit Aufgaben können Sie diese Art von Informationen in der Ausführungskontext . Hier ist ein Beispiel , wie man es unter Verwendung des logischen Aufrufkontextes macht, der eine Art ist des Ausführungskontextes. Trace.CorrelationManager wird ebenfalls über den Ausführungskontext erstellt.

    
Anton Tykhyy 28.06.2014 16:53
quelle