как абстрагировать вызов метода

#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 работает как шарм. Спасибо за совет, хотя