Czasami użytkownik rozpoczyna rozszerzoną operację techniczną, której wykonanie zajmuje trochę czasu. W takich przypadkach zazwyczaj miło jest wyświetlić pasek postępu wraz z informacją o tym, które zadanie jest aktualnie wykonywane.
Aby uniknąć ścisłego powiązania interfejsu użytkownika i warstw logicznych, zwykle najlepiej jest, aby komunikacja odbywała się za pośrednictwem pewnego rodzaju serwera proxy. Oznacza to, że zaplecze nie powinno manipulować własnymi elementami interfejsu użytkownika, ani nawet bezpośrednio oddziaływać z warstwą pośrednią.
Oczywiście musi być jakieś oddzwonienie, aby to zadziałało. Generalnie zaimplementowałem go na dwa sposoby:
Przekaż zmienny obiekt do zaplecza i niech zaplecze wprowadzi do niego zmiany w miarę postępu. Obiekt powiadamia interfejs użytkownika, gdy nastąpi zmiana.
Przekaż funkcję zwrotną formularza
void f(ProgressObject)
lubProgressObject -> unit
wywołaną przez back-end. W tym przypadku back-end konstruujeProgressObject
i jest całkowicie pasywny. Zakładam, że musi on skonstruować nowy obiekt za każdym razem, gdy chce zgłosić postęp.
Jakie są wady i zalety tych metod? Czy istnieje uzgodniona najlepsza metoda użycia? Czy istnieją różne okoliczności ich użycia?
Czy przeoczyłem zupełnie inne techniki raportowania postępów?
BackgroundWorker
tego, o którym wspomina RH. Zawinięte w niestandardową klasę wraz z „formularzem postępu” itp. Oraz prostym mechanizmem komunikowania wyjątku - jak BackgroundWorker
z założenia działa w osobnym wątku. W zakresie, w jakim korzystamy z jego funkcji w sposób sugerowany przez .Net, można to uznać za idiomatyczne. W każdym kontekście języka / frameworku „idiomatyczny” może być najlepszy.