Иногда пользователь запускает расширенную техническую операцию, выполнение которой занимает некоторое время. В этих случаях обычно удобно отображать какой-то индикатор выполнения вместе с информацией о том, какая задача выполняется в данный момент.
Чтобы избежать тесной связи между пользовательским интерфейсом и уровнями логики, обычно лучше, чтобы связь происходила через какой-то тип прокси. То есть серверная часть не должна манипулировать своими собственными элементами пользовательского интерфейса или даже напрямую взаимодействовать с промежуточным уровнем.
Очевидно, что где-то должен быть обратный вызов, чтобы сделать эту работу. Я вообще реализовал это одним из двух способов:
Передайте изменяемый объект в бэкэнд, и пусть бэкэнд внесет в него изменения в процессе работы. Объект уведомляет интерфейс, когда происходит изменение.
Передайте функцию обратного вызова в форме
void f(ProgressObject)
или,ProgressObject -> unit
которую вызывает серверная часть. В этом случае серверная часть создаетProgressObject
и она полностью пассивна. Я предполагаю, что он должен создавать новый объект каждый раз, когда хочет сообщить о прогрессе.
Каковы недостатки и преимущества этих методов? Есть ли согласованный лучший метод для использования? Существуют ли разные обстоятельства для их использования?
Существуют ли совершенно разные методы отчетности о прогрессе, которые я пропустил?
BackgroundWorker
это RH упоминает. Завернут в пользовательский класс вместе с «формой прогресса» и т. Д. И простым механизмом сообщения об исключении - так как BackgroundWorker
по замыслу выполняется в отдельном потоке. Если мы будем использовать его возможности способом, предложенным .Net, то это можно назвать идиоматическим. И в любом конкретном языковом / каркасном контексте «идиоматический» может быть лучшим.