Описание проблемы : вы пишете библиотеку, которая содержит некоторые алгоритмы / задачи, выполнение которых может занять много времени по разным причинам: вычислительным, файловая система, сетевое взаимодействие и т. Д. Вы хотите иметь возможность :
- Отправить некоторую информацию о ходе выполнения задачи (прогресс, ведение журнала активности и т. Д.)
- Есть способ прервать задачу до ее завершения, если был установлен какой-либо внешний сигнал или свойство.
Я реализовал для этого фреймворк, но для этого необходимо, чтобы все такие задачи ссылались на сборку, которая содержит этот фреймворк.
Мой вопрос: Есть ли уже встроенный механизм в .NET Framework (3.5 или ниже) для описанной выше проблемы?
Я знаю, что мог бы использовать события, но это означало бы, что долго выполняющиеся задачи должны были бы выставлять такие события, которые, я думаю, являются накладными. В идеале я хочу иметь структуру, которая скрывает проблемы многопоточности и является дружественной к внедрению зависимостей, но не будет зависеть от дополнительной пользовательской сборки и не будет загрязнять оригинальный интерфейс.
Надеюсь, я достаточно хорошо описал проблему. Если нет, я могу опубликовать некоторые примеры интерфейсов из моей собственной платформы.
ОБНОВЛЕНИЕ : ОК, я думаю, что мое описание проблемы нуждается в небольшом уточнении :). Когда я говорю «длительный», я не имею в виду «длинный» в смысле рабочего процесса. Я работаю над картографическим приложением WinForms, которое делает все что угодно, например, генерирует рельефные контуры . Для этого сначала необходимо загрузить файлы данных высот с FTP-сервера, разархивировать их, а затем выполнить некоторые вычисления. Я написал код для этого давным-давно, но для того, чтобы сделать его более удобным для графического интерфейса, я должен установить различные проверки, например, чтобы пользователь нажал кнопку «Прервать» и остановил процесс.
Итак, в основном меня беспокоит: как написать код, который позже (если вообще когда-либо) можно будет использовать в среде с графическим интерфейсом, где вы не можете просто запустить все в основном потоке графического интерфейса и заморозить все приложение. Задача состоит в том, чтобы найти способ сделать ваш код подходящим для целей графического интерфейса без привязки его к конкретной платформе графического интерфейса.