#c# #architecture #abstraction
#c# #архитектура #абстракция
Вопрос:
У меня есть список задач, которые пользователь может предварительно сформировать. Каждый из них займет некоторое время, поэтому они должны выполняться в фоновом потоке и сообщать о своем прогрессе потоку пользовательского интерфейса.
Моя проблема в том, как добиться этого каким-то абстрактным способом (без большого переключения).
То, что у меня есть сейчас, — это задача класса
public class Task {
public string Name { get; set; }
public ??? Action { get; set; } // Doesn't compile
}
Список со всеми задачами, которые будут отображать пользовательский элемент управления, представляющий задачу (TaskUC) при изменении выбора. Этот пользовательский элемент управления имеет событие выполнения ( TaskUC.Execute = TaskExecute
), которое запускается, когда пользователь хочет выполнить задачу.
Моя проблема здесь. В методе TaskExecute я хочу инициализировать BackgroundWorker, где в задаче должен быть определен обработчик DoWork.Экшен. Что-то вроде этого:
private void TaskExecute(object sender, RoutedEventArgs e) {
Task task = (Task) e.OriginalSource;
BackgroundWorker worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.RunWorkerCompleted = WorkerRunWorkerCompleted;
worker.DoWork = task.Action; // Doesn't compile
worker.RunWorkerAsync();
}
И в том же классе, который обрабатывает TaskExecute, есть методы для обработки каждой задачи.
private void Task1(object sender, DoWorkEventArgs e) {}
Итак, в случае, если пользователь выберет первую задачу, мне нужно сопоставить задачу.Действие к методу Task1.
Ответ №1:
DoWork
Событие является DoWorkEventHandler
.
Чтобы добавить делегат к этому событию, он должен иметь тип DoWorkEventHandler
.
Ответ №2:
Мое предложение заключается в том, чтобы не изобретать Task
заново. Используйте Task<T>
который инкапсулирует все, что вы ищете.
Взгляните сюда.
Но для ответа ответ SLaks правильный.
Комментарии:
1. не знал класс Task, и я собираюсь взглянуть на него. Но на самом деле ответ SLaks работает как шарм. Спасибо за совет, хотя