Wie funktioniert Task.CurrentId?

7

Ich lerne gerade, wie man Aufgaben verwendet, async und in Windows Store ("Metro") apps warten. Ich stolperte über die Eigenschaft Task.CurrentId und versuche zu verstehen, wie es funktioniert.

Laut MSDN gibt " Eine Ganzzahl, die vom System der aktuell ausgeführten Task "" zugewiesen wurde. Also habe ich das Hinzufügen dieses Werts zu meinem benutzerdefinierten Logger hinzugefügt, aber zu meiner Überraschung hat keine meiner Test-Apps jemals etwas anderes als null geloggt.

Sehen Sie sich dieses Beispiel an:

%Vor%

Alle diese IDs sind null . Warum? Dieser Code erstellt Aufgaben, nicht wahr? Sollten sie keine ID haben?

    
Sebastian Negraszus 18.01.2013, 12:42
quelle

2 Antworten

10

Da Sie async / await verwenden, werden alle Ihre Task.CurrentId -Aufrufe im UI-Thread ausgeführt.

Der UI-Thread ist kein Task , also hat er eine Null CurrentId

Wenn Sie ein Task erstellen, wird dessen CurrentId festgelegt:

%Vor%     
Nicholas Butler 18.01.2013, 12:45
quelle
8
  

Laut MSDN gibt es "Eine Ganzzahl, die vom System der aktuell ausgeführten Task zugewiesen wurde" zurück   ...   Dieser Code erstellt Aufgaben, nicht wahr? Sollten sie keine ID haben?

Der Schlüssel dort ist "gerade ausgeführt".

Es gibt zwei Arten von Task s: Ein Typ von Task führt Code aus, und der andere Typ von Task ist nur eine abstrakte Darstellung einer Art von Operation oder Ereignis. Beispielsweise erstellt Task.Run eine Code ausführende Aufgabe, die ihren Code in einem Thread-Pool-Thread ausführt. Task.Delay erstellt eine Vorgangs- / Ereignisaufgabe, die beim Auslösen eines Timers abgeschlossen wird.

Die von async Methoden zurückgegebenen Tasks stellen die Methode selbst dar, also sind sie eigentlich eine Operation / Ereignis-Task anstelle einer Codetask. Der Code in async -Methoden kann als Delegate oder als mehrere verschiedene Aufgaben (oder eine Mischung aus beiden) ausgeführt werden. Selbst wenn Sie eine CurrentId innerhalb einer async -Methode erhalten (was anzeigt, dass Sie innerhalb einer Code ausführenden Aufgabe laufen), würde sich diese ID von der ID der von der Methode zurückgegebenen Aufgabe unterscheiden (was immer der Fall ist eine Operation / Ereignis-Task).

    
Stephen Cleary 18.01.2013 14:42
quelle

Tags und Links