Как правильно сделать изменение картинки в ходе выполнения задачи?

Вот здесь https://github.com/Modus-Exciter/RW.Ring/blob/master/source/Notung/IRunBase.cs описан интерфейс задач, которые выполняются в диалоге с оповещением о прогрессе операции и, опционально, с поддержкой отмены. При этом задача может либо знать процент своего выполнения, либо не знать, и в последнем случае на диалоге вместо индикатора прогресса отображается бегущая строка.

Но на этом диалоге, кроме текста со статусом операции и индикатором прогресса / бегущей строки ещё есть картинка, сопоставленная задаче, и заголовок. Сейчас заголовок берётся либо из ToString задачи, либо из её атрибута DiplayName, если есть. А картинка задаётся извне при запуске задачи. Последнее мне кажется не вполне правильным, вероятно, задача должна знать про картинку и, если добавлю такую фичу, то и анимацию; это позволит, например, при необходимости менять их в ходе выполнения задачи. Но и тащить внутрь задачи, в которой всё относится к оповещению о прогрессе выполнения и отмене, графику тоже как-то не очень логично. По идее, задача - эта абстракция уровня компонентной модели, которую пользовательский интерфейс (диалог) просто рисует своими средствами.

Понятно, что решений тут может быть множество, но все они какие-то недостаточно элегантные и логичные.

  1. Оставить как есть и передавать картинку через отдельный класс. Но картинка всё же связана с задачей, кроме того, при таком решении задача не может поменять картинку и заголовок.
  2. Передавать картинку через аргумент события ProgressChanged. А как тогда задать начальную картинку, до того, как задача начала оповещать о прогрессе операции?
  3. Использовать интерфейс IServiceProvider и запрашивать картинку через него. Для динамического оповещения о смене картинки можно использовать значение специального типа в аргументе события ProgressChanged. Вроде бы это решает все проблемы, но как-то громоздко и неэлегантно.
  4. Добавить члены в существующие интерфейсы. Не хочу портить логичные и минималистичные интерфейсы.
  5. Добавить новые интерфейсы, чтобы опционально реализовывать их в некоторых задачах. Но это отличается от решением №3 только тем, что вместо стандартного интерфейса используется свой, что явно не лучше.

Ответы (0 шт):