2011-01-13 12 views
7

Ich muss einen Weg entwerfen und implementieren, um mit lang laufenden Prozessen in einer Client/Server-Anwendung umzugehen. Ein typischer langwieriger Prozess würde 2-3 Minuten dauern. Ich muss der UI in der Zwischenzeit auch einen Fortschritt melden und die Benutzeroberfläche reaktionsbereit halten.Fortschrittsbenachrichtigung in WCF für lang andauernde Prozesse - Wie?

Nachdem diese in meinem Kopf dachte ich, ein paar Lösungen:

  • Ein Asynchron-Anfrage den Vorgang zu starten, die den serverseitigen Prozess startet und gibt einen zugewiesenen LRPID (Long Lauf Prozess-ID) dann Abfrage regelmäßig vom Client mit dieser LRPID. (Pro: einfach zu implementieren, keine Firewall Herumspielen Con: unelegant, raubend Ressource etc.)

  • Verwenden ein Duplex-Bindung (wie NetTcpBinding) und initiieren Rückrufe vom Server als Fortschritte gemacht werden (Pro: elegant, effizient, Con: Deployment Alptraum)

  • [Ihr Vorschlag ???]

Was würden Sie davon halten?

+0

Was ist die Client-Seite app geschrieben? –

+0

Bereitstellungsalbtraum? Warum, wegen IIS/WAS? Dann benutze sie nicht. –

+0

@Daniel Auger: Die Client-App ist in WPF geschrieben –

Antwort

4

Hier ist ein post von Dan Wahlin zum Erstellen einer WCF-Fortschrittsanzeige für eine Silverlight-Anwendung. Dies sollte hilfreich sein.

+0

sieht ziemlich cool aus, ich muss etwas mehr hineinschauen.Vielen Dank! –

+0

Ok, das war der beste Mittelweg! Vor allem, weil '" ... initiiert eine Netzwerkanforderung, und dann die Anfrage ist effektiv "in den Ruhezustand" warten auf den Server zu reagieren (es kommt nicht sofort zurück). Der Server hält dann die Verbindung offen, aber nicht aktiv bis es etwas zurücksendet (oder die Verbindung nach 90 Sekunden abbricht - zu diesem Zeitpunkt verbindet sich der Duplex-Client erneut und wartet). Auf diese Weise vermeiden Sie, wiederholt auf den Server zu treffen - und erhalten dennoch eine sofortige Antwort, wenn Daten vorhanden sind senden. "' –

+0

oder mit anderen Worten, ein bereits implementiertes, leichtgewichtiges und effektives Abfragesystem, das eine True-Two-Way-Version simuliert –

1

Wenn Sie sich nicht um die Firewall des Clients kümmern müssen, usw. ... würde ich wahrscheinlich mit Ihrer ersten Lösung gehen und eine BackGroundWorker verwenden, um den Anruf zu tätigen, damit der UI-Thread nicht blockiert wird. Ich habe das kürzlich für eine App getan, bei der eine Anfrage zum Erzeugen eines Berichts in eine Warteschlange gestellt wird und sobald sie fertig ist, wird sie abgerufen. Es scheint gut zu funktionieren.

0

Eine andere Möglichkeit (ohne die WCF-Bindung ändern zu müssen) besteht darin, ein WebBrowser-Steuerelement im WPF-Client und SignalR zu verwenden, um Fortschrittsnachrichten vom Server an dieses Steuerelement zu senden.

Beachten Sie, dass zur Vermeidung von JavaScript-Fehlern, die mit dem WebBrowser-Steuerelement auftreten (weil standardmäßig Internet Explorer Version 7 zu verwenden scheint, die nicht mit jQuery.js kompatibel zu sein scheint), müssen Sie die Schlüssel hinzufügen Registrierung auf dem Client-Computer, um den Standard für die Client-App zu ändern, um IE10 oder höher zu verwenden - siehe http://weblog.west-wind.com/posts/2011/May/21/Web-Browser-Control-Specifying-the-IE-Version). Dies könnte eine Fehlfunktion bei der Bereitstellung sein (da Admin-Rechte erforderlich zu sein scheinen - z. B. auf einem 64-Bit Windows 8.1-PC - um die Registrierungsschlüssel hinzuzufügen). Außerdem scheint es immer noch erforderlich, die lange laufende WCF-Methode in einem separaten Thread aufzurufen, da das WebBrowser-Steuerelement seine Anzeige nicht zu aktualisieren scheint, um die SignalR-Nachrichten anzuzeigen, die es empfängt. (Dies ist sinnvoll, da der UI-Thread sonst warten müsste, bis der WCF-Aufruf beendet wurde).

Aber ich erwähne es als Alternative ein neueres Werkzeug (SignalR) :)