Manchmal startet der Benutzer einen erweiterten technischen Vorgang, dessen Ausführung eine Weile dauert. In diesen Fällen ist es normalerweise hilfreich, eine Art Fortschrittsbalken zusammen mit Informationen darüber anzuzeigen, welche Aufgabe gerade ausgeführt wird.
Um eine enge Kopplung der Benutzeroberfläche und der Logikschichten zu vermeiden, ist es normalerweise am besten, die Kommunikation über eine Art Proxy durchzuführen. Das heißt, das Back-End sollte nicht seine eigenen UI-Elemente manipulieren oder sogar direkt mit der Zwischenschicht interagieren.
Offensichtlich muss es irgendwo einen Rückruf geben, damit dies funktioniert. Ich habe es im Allgemeinen auf zwei Arten implementiert:
Übergeben Sie ein veränderbares Objekt an das Back-End, und lassen Sie das Back-End im Verlauf Änderungen daran vornehmen. Das Objekt benachrichtigt das Front-End, wenn eine Änderung auftritt.
Übergeben Sie eine Rückruffunktion des Formulars
void f(ProgressObject)
oderProgressObject -> unit
des vom Backend aufgerufenen Formulars . In diesem Fall erstellt das Back-End dasProgressObject
und es ist vollständig passiv. Ich nehme an, es muss jedes Mal ein neues Objekt erstellen, wenn es den Fortschritt melden möchte.
Was sind die Nachteile und Vorteile dieser Methoden? Gibt es eine vereinbarte beste Methode? Gibt es unterschiedliche Umstände für ihre Verwendung?
Gibt es völlig andere Techniken zur Berichterstattung über Fortschritte, die ich übersehen habe?
BackgroundWorker
diese RH-Erwähnungen. Eingewickelt in eine benutzerdefinierte Klasse zusammen mit einem "Fortschrittsformular" usw. und einem einfachen Mechanismus zum Kommunizieren einer Ausnahme - wie BackgroundWorker
beabsichtigt in einem separaten Thread ausgeführt. In dem Maße, in dem wir seine Funktionen auf eine von .Net vorgeschlagene Weise verwenden, könnte man sagen, dass dies idiomatisch ist. Und in jedem gegebenen Sprach- / Rahmenkontext kann "idiomatisch" am besten sein.