2012-04-03 14 views
2

Wenn ich meinen WCF-Dienst (gehostet in II7) und PerSession für contextinstance ausführt, ist eine Sitzung die gleiche wie ein Thread? Was passiert, wenn der Client keine Anrufe tätigt, aber eine Sitzung mit dem Dienst hat? Nimmt die Sitzung noch einen Thread?WCF 1 Session = 1 Thema?

Wenn ich zu PerCall ändere, finde ich, dass ich einen Thread pro Anruf bekomme und dass dieser Thread zurückgegeben wird, wenn der Anruf vorbei ist.

Wo finde ich diese Informationen?

Antwort

3

Ich glaube, dass Sie Antworten und gute Erklärungen here finden können.

auf einen Blick würden Sie PerCall verwenden Skalierbarkeit Gründen und PerSession für die gängigen Web-Szenarien.

  • Wenn PerSession mit einmal Client hat zunächst Anruf-Instanz von Service-Implementierung auf dem Server gehalten werden. Jeder Client hat seine eigene Sitzung nur auf einem Thread (!) pro Client ausgeführt. Also, ja 1 Sitzung == 1 Thread standardmäßig. Sie können aber auch ConcurrencyMode ändern, sodass der Client innerhalb einer Sitzung viele gleichzeitige Aufrufe ausführen kann.

  • Im Fall von PerCall Dienstinstanz wird sofort nach dem Anruf entsorgt.

[EDITED (nach Gesprächen mit David Nelson)]:

Es bedeutet nicht, den gleichen Thread (!)! Es bedeutet nur, dass ThreadPool verfügbaren Thread zum Ausführen von Dienstcode verwendet. Aber wenn Sie 1000 gleichzeitige Clients starten, wird ThreadPool viele Threads zuweisen, die Ressourcen wie Speicher einschließen.

Erläuterung der Threads Verwendung mit Code:

Ich hat einfachen Rechner Service wie beschreitet Arbeiten für WCF-Dienst zu zeigen.

ich Accumulate Methode mit Parameter 2 für fünf mal ausgeführt und dann erstellt neue Client-Proxy und tat das gleiche. Es folgt die Ausgabe, die beweist, dass der Server die Instanz der Dienstimplementierung beibehält (threadId beim Erstellen), aber die Methoden auf verschiedenen Threads ausgeführt werden, die aus ThreadPool stammen.

I'm calculator 
Accumulated: 2. ThreadIdOnServiceCreating:6 CurrentThreadId:6 
Accumulated: 4. ThreadIdOnServiceCreating:6 CurrentThreadId:7 
Accumulated: 6. ThreadIdOnServiceCreating:6 CurrentThreadId:6 
Accumulated: 8. ThreadIdOnServiceCreating:6 CurrentThreadId:7 
Accumulated: 10. ThreadIdOnServiceCreating:6 CurrentThreadId:6 
Accumulated: 2. ThreadIdOnServiceCreating:9 CurrentThreadId:9 
Accumulated: 4. ThreadIdOnServiceCreating:9 CurrentThreadId:6 
Accumulated: 6. ThreadIdOnServiceCreating:9 CurrentThreadId:9 
Accumulated: 8. ThreadIdOnServiceCreating:9 CurrentThreadId:6 
Accumulated: 10. ThreadIdOnServiceCreating:9 CurrentThreadId:8 
+0

Das Dokument, auf das Sie verwiesen haben, sagt nichts über jede Sitzung aus, die auf einem Thread pro Client ausgeführt wird. Wie sind Sie zu dieser Schlussfolgerung gekommen? –

+0

Zum Beispiel lesen Sie es hier: http://mkdot.net/mknetug/b/dejan/archive/2008/04/29/wcf-service-behaviors-instance-and-concurrency-management.aspx –

+0

Dieser Artikel ist schlecht formuliert und letztlich ungenau. Nachfolgende Anforderungen in derselben Sitzung können auf verschiedenen Threads ausgeführt werden. Es ist sehr einfach, einen Dienst aufzubauen, um dies zu beweisen. –

1

„Wenn ich meine WCF-Dienst (hosted in II7) laufen und verwendet PerSession auf contextinstance, wird eine Sitzung das gleiche wie ein Faden sein?“

Nein, Anfragen werden vom Thread-Pool bearbeitet.

"Was passiert, während der Client keine Anrufe tätigt, aber eine Sitzung über den Dienst hat? Wird die Sitzung noch einen Thread aufnehmen?"

Nein, die Sitzung nimmt keinen Thread, wenn keine Anfragen bearbeitet werden.Eine WCF- "Sitzung" ist nur Daten; Status an eine Sitzungs-ID gebunden. Es hat nichts mit Threads zu tun.

+0

Wenn Sie sagen, dass die Anfrage vom Thread-Pool behandelt wird, ist es nicht dasselbe wie die Verwendung von Thread, selbst wenn es von ThreadPool zugewiesen wurde? –

+0

Nein, es ist nicht dasselbe. Insbesondere gibt es keine Garantie dafür, dass nachfolgende Anfragen in derselben Sitzung den gleichen Thread verwenden, den frühere Anfragen verwendet haben. Neue Anfragen werden von einem Thread-Pool-Thread bedient, wenn einer verfügbar ist. –

+0

Hi ... Also ich habe dein Wort nicht genommen und Service mit Sessions aufgebaut um es zu verifizieren. Und Sie haben Recht, dass ein anderer Thread für dieselbe Sitzung von einem Client verwendet werden kann. Aber es bedeutet nur, dass ThreadPool effektiv verwendet wird. Aber wenn Sie 1000 gleichzeitige Clients starten, wird ThreadPool viele Threads zuweisen, was Ressourcen beinhaltet –

Verwandte Themen