У меня есть список задач, которые пользователь может выполнить.Каждый из них займет некоторое время, поэтому они должны работать в фоновом потоке и сообщать о своем прогрессе потоку пользовательского интерфейса.
Моя проблема заключается в том, как добиться этого каким-то абстрактным образом (без большого переключателя).
Теперь у меня есть класс Task
public class Task {
public string Name { get; set; }
public ??? Action { get; set; } // Doesn't compile
}
ListBox со всеми задачами, которые будут рисовать UserControl, представляющий Task (TaskUC) в SelectionChanged.Этот UserControl имеет событие Execute (TaskUC.Execute += TaskExecute
), которое срабатывает, когда пользователь хочет выполнить задачу.
Моя проблема здесь.В методе TaskExecute я хочу инициализировать BackgroundWorker, где в Task.Action должен быть определен обработчик 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) {}
Поэтому, если пользователь выберет первую задачу, янеобходимо сопоставить Task.Action с методом Task1.