Wirklich asynchroner WCF-Dienst

8

Ich implementiere einen asynchronen Dienst. Nachdem ich Microsofts Beispiel evaluiert habe, frage ich mich, ob ihr Ansatz wirklich asynchron ist. Ich bin mir ziemlich sicher, dass es ist, aber einige der Samples, die ich online gesehen habe, und der Parameter AsyncCallback veranlassen mich dazu, mich zu wundern.

Gemäß dem Beispiel müssen wir das Methodenpaar Begin und End wie folgt implementieren:

%Vor%

Ganz einfach, aber warum haben wir einen Parameter AsyncCallback ? Sollten wir nicht zu callback aufrufen, was wiederum die Methode Ende auslöst?

Das habe ich im Sinn:

%Vor%

Ich habe Lasttests mit loadUI durchgeführt, aber es gab keine offensichtlichen Leistungsänderungen.

    
André Hauptfleisch 09.11.2011, 12:27
quelle

2 Antworten

5

Ich habe eine gefunden Guter Artikel , der erklärt, wie Sie die bestmögliche Leistung aus Ihrem Async WCF-Dienst herausholen können.

Das Wesentliche ist:

  1. In der Begin -Methode und
  2. sollten Sie keine schwere Arbeit verrichten
  3. Führen Sie den Rückruf aus, um die Methode Ende auszulösen.

Hier ist ein Auszug aus dem Text:

Um die beste Leistung zu erzielen, folgen hier zwei Prinzipien, wenn Sie das obige asynchrone Muster aufrufen / implementieren:

  • Prinzip 1: Führen Sie keine schwergewichtige Arbeit innerhalb der Methode Begin aus ...

    Der Grund dafür ist, dass Sie den aufrufenden Thread so schnell wie möglich zurückgeben sollten, damit der Anrufer andere Arbeiten einplanen kann. Wenn es sich um einen UI-Thread handelt, muss die Anwendung den Thread verwenden, um auf Benutzereingaben zu reagieren. Sie sollten wenn möglich immer schwere Operationen in einen anderen Thread einfügen.

  • Prinzip 2: Vermeiden Sie den Aufruf der Methode Ende für denselben Thread der Methode Begin .

    >

    Die Methode Ende blockiert normalerweise. Es wartet auf den Abschluss des Vorgangs. Wenn Sie die End -Methode implementieren, sehen Sie, dass sie tatsächlich IAsyncResult.WaitHandle.WaitOne () aufruft. Auf der anderen Seite ist diese WaitHandle als normale Implementierung eine Verzögerung, die ManualResetEvent zugewiesen ist. Solange Sie es nicht anrufen, würde es überhaupt nicht zugewiesen werden. Für schnelle Operationen ist das ziemlich günstig. Wenn jedoch Ende aufgerufen wird, müssen Sie es zuweisen. Der richtige Ort für den Aufruf von Ende ist der -Rückruf des Vorgangs. Wenn der Callback aufgerufen wird, bedeutet dies, dass die Blockierungsarbeit wirklich abgeschlossen ist. An dieser Stelle können Sie Ende aufrufen, um Daten ohne Leistungseinbußen abzurufen.

André Hauptfleisch 30.11.2011, 09:39
quelle
2

Ich denke, der Hauptgrund dafür ist, dass die WCF-Laufzeit die Thread-Synchronisation behandelt, im Gegensatz zu der manuellen Handhabung.

Wenn Sie die Endmethode über Callback aufgerufen haben, müssten Sie mit der Synchronisation umgehen, wodurch das Muster ein wenig komplexer wird (wie Sie in Ihren Codebeispielen sehen können). Das Ziel dieses Patterns ist nicht, dass Sie sich des Threading-Krams wirklich bewusst sind, sondern nur Ihre lang andauernde Operation codieren wollen, ohne über die Implementierungsdetails des Threads nachdenken zu müssen.

    
Paul Tyng 10.11.2011 13:52
quelle

Tags und Links