как абстрагировать вызов метода - PullRequest
1 голос
/ 04 мая 2011

У меня есть список задач, которые пользователь может выполнить.Каждый из них займет некоторое время, поэтому они должны работать в фоновом потоке и сообщать о своем прогрессе потоку пользовательского интерфейса.

Моя проблема заключается в том, как добиться этого каким-то абстрактным образом (без большого переключателя).

Теперь у меня есть класс 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.

Ответы [ 2 ]

1 голос
/ 04 мая 2011

Мое предложение состоит в том, чтобы не изобретать заново Task. Используйте Task<T>, который включает в себя все, что вы ищете.

Посмотрите здесь .


Но для ответа, SLaks ответ правильный.

1 голос
/ 04 мая 2011

Событие DoWork является DoWorkEventHandler.
Чтобы добавить делегата к этому событию, оно должно иметь тип DoWorkEventHandler.

...