8 Stimmen

Fortschrittsmeldung in WCF für lang laufende Prozesse - Wie?

Ich muss einen Weg entwerfen und implementieren, um mit lang laufenden Prozessen in einer Client/Server-Anwendung umzugehen. Ein typischer lang laufender Prozess würde/könnte 2-3 Minuten dauern. Ich muss auch Fortschritte an die UI in der Zwischenzeit zu berichten und halten die UI reaktionsschnell.

Mit diesen Gedanken im Hinterkopf habe ich mir ein paar Lösungen ausgedacht:

  • Eine asynchrone Anforderung zum Starten des Prozesses, die den serverseitigen Prozess startet und eine zugewiesene LRPID (Long Running Process ID) zurückgibt dann regelmäßig vom Client mit dieser LRPID abfragen. ( Pro Einfach zu implementieren, keine Firewall-Probleme Betrug : Unelegant, ressourcenaufwendig usw.)

  • Verwenden Sie eine Duplexbindung (z. B. NetTcpBinding) und initiieren Sie Rückrufe vom Server, wenn Fortschritte gemacht werden ( Pro : Elegant, effizient, Betrug : Einsatz-Albtraum)

  • [Ihr Vorschlag???]

Was ist Ihre Meinung dazu?

4voto

Matt Klepeis Punkte 1704

Hier ist ein Beitrag von Dan Wahlin über die Erstellung eines WCF-Fortschrittsindikators für eine Silverlight-Anwendung. Dies sollte hilfreich sein.

1voto

Daniel Auger Punkte 12325

Wenn Sie sich nicht um die Firewall des Kunden usw. kümmern wollen. würde ich wahrscheinlich Ihre erste Lösung wählen und eine BackGroundWorker um den Aufruf vorzunehmen, damit der UI-Thread nicht blockiert wird. Ich habe dies vor kurzem für eine Anwendung getan, bei der eine Anforderung zur Erstellung eines Berichts in eine Warteschlange gestellt wird und abgerufen wird, sobald sie erledigt ist. Es scheint gut zu funktionieren.

0voto

patrickjlee Punkte 110

Eine andere Möglichkeit (ohne die WCF-Bindung ändern zu müssen) ist die Verwendung eines WebBrowser-Steuerelements im WPF-Client und SignalR, um Fortschrittsmeldungen vom Server an dieses Steuerelement zu senden.

Beachten Sie, dass Sie zur Vermeidung von Javascript-Fehlern, die mit dem WebBrowser-Steuerelement auftreten (weil es standardmäßig Internet Explorer Version 7 zu verwenden scheint, die nicht mit jQuery.js kompatibel zu sein scheint), Schlüssel zur Registrierung auf dem Client-Rechner hinzufügen müssen, um die Standardeinstellung für die Client-Anwendung so zu ändern, dass IE10 oder höher verwendet wird - siehe http://weblog.west-wind.com/posts/2011/May/21/Web-Browser-Control-Specifying-the-IE-Version ). Dies könnte eine Bereitstellung Ärgernis sein (weil Admin-Rechte zu sein scheinen erforderlich - z.B. auf einem 64-Bit-Windows 8.1 PC - um die Registrierungsschlüssel hinzufügen). Auch scheint es immer noch notwendig, um die lang laufende WCF-Methode in einem separaten Thread aufrufen, sonst die WebBrowser-Steuerelement scheint nicht zu aktualisieren seine Anzeige, um die SignalR-Nachrichten zu zeigen, die es empfangen wird. (Dies macht Sinn, weil der UI-Thread sonst warten müsste, bis der WCF-Aufruf beendet ist).

Ich erwähne es jedoch als alternativen Ansatz unter Verwendung eines neueren Tools (SignalR) :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X