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:
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:
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:
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:
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.
Tags und Links wcf c# task-parallel-library asynchronous