Verwendet der Aufruf der asynchronen aufgabenbasierten WCF-Methode den E / A-Abschluss-Port oder einen Thread-Pool-Thread, um die Fortsetzung aufzurufen?

8

Ich habe den folgenden WCF-Vertrag:

%Vor%

Die GetServiceVersion ist eine einfache Methode, die einen String zurückgibt. Es wird als Ping verwendet, um zu prüfen, ob der Dienst erreichbar ist.

Ich würde es jetzt asynchron nennen und denke, es wäre effizienter als .NET-Threads, um es im Hintergrund aufzurufen.

Also, ich habe die folgende Schnittstelle nur für diesen Zweck entwickelt:

%Vor%

Dies ermöglicht das asynchrone Aufrufen der GetServiceVersion API:

%Vor%

Der Code funktioniert.

Meine Frage ist das - nutzt es die IOCP, um die Fortsetzung aufzurufen?

Gibt es im Allgemeinen eine Möglichkeit zu wissen, ob eine Fortführung über IOCP aufgerufen wird oder nicht (im Debugger, falls erforderlich)?

P.S.

Hier ist der Stack-Trace meiner asynchronen WCF-Methode Fortsetzung:

%Vor%

Nun sieht dieser Stack-Trace sehr ähnlich dem aus, den ich für eine Methode bekomme, die von Task.Factory.StartNew aufgerufen wird und tatsächlich Thread-basiert ist:

%Vor%     
mark 17.03.2014, 21:03
quelle

1 Antwort

7

Zuerst müssen Sie TaskContinuationOptions.ExecuteSynchronously hinzufügen, um sicherzustellen, dass der Continuation Callback für denselben Thread aufgerufen wird, für den die Async-IO-Operation abgeschlossen wurde:

%Vor%

Offenbar gibt es in .NET keine API, um festzustellen, ob der Thread ein IOCP-Pool-Thread ist. Sie können nur feststellen, ob der Thread ein Thread-Pool-Thread ist ( Thread.CurrentThread.IsThreadPoolThread ), der auch für IOCP-Threads true ist.

In Win32 wird ein IOCP-Thread-Pool erstellt mit CreateIoCompletionPort API, aber ich konnte keine Win32-API finden, um zu überprüfen, ob der Thread zu einem solchen Pool gehört.

Also, hier ist ein bisschen konstruiertes Beispiel, um diese Theorie in der Praxis zu überprüfen, mit HtppClient als Testvehikel. Zuerst stellen wir sicher, dass alle Nicht-IOCP-Threads die ThreadStatic Variable s_mark mit -1 gefüllt haben. Dann initiieren wir eine IO-gebundene Operation und überprüfen s_mark auf Thread, wo die IO-gebundene Operation abgeschlossen ist:

%Vor%

Die Ausgabe:

%Vor%

Ich denke, dies könnte ausreichen, um die Theorie zu bestätigen, dass eine IO-gebundene Fortsetzung in einem IOCP-Thread passiert.

Eine gute Lektüre, verwandt: "Es gibt keinen Faden" von Stephen Cleary.

    
Noseratio 18.03.2014, 09:34
quelle