Іноді користувач запускає розширену технічну операцію, яка потребує певного часу. У цих випадках зазвичай приємно відображати якусь панель прогресу, а також інформацію про те, яке завдання виконується зараз.
Щоб уникнути тісного з’єднання інтерфейсу користувача та логічних шарів, зазвичай, краще, щоб спілкування відбувалося через якийсь проксі. Тобто, бек-енд не повинен маніпулювати власними елементами інтерфейсу або навіть безпосередньо взаємодіяти з посередницьким шаром.
Очевидно, що для того, щоб зробити цю роботу, десь повинен бути якийсь зворотний дзвінок. Я зазвичай реалізував це одним із двох способів:
Передайте змінений об’єкт до бек-енду і змушуйте його вносити зміни в хід. Об'єкт повідомляє лицьову сторону, коли відбувається зміна.
Передайте функцію зворотного дзвінка форми
void f(ProgressObject)
абоProgressObject -> unit
те, що викликає зворотній зв'язок. У цьому випадку бек-енд сконструюєProgressObject
і це повністю пасивно. Я повинен будувати новий об'єкт кожного разу, коли він хоче повідомити про прогрес.
Які недоліки та переваги цих методів? Чи є узгоджений найкращий метод використання? Чи існують різні обставини їх використання?
Чи існують зовсім інші методи звітування про прогрес, які я не помітив?
BackgroundWorker
це RH згадує. Загорнутий у нестандартний клас разом із "формою прогресу" тощо та простим механізмом передачі винятку - як BackgroundWorker
за допомогою дизайну працює в окрему нитку. Наскільки ми використовуємо його риси у спосіб, запропонований .Net, тоді це можна сказати як ідіоматичне. І в будь-якому даному мовному / рамковому контексті "ідіоматичне" може бути найкращим.