С# BackgroundWorker Добавить System.EventHandler в RunWorkerCompleted

Timer timer = new Timer();
BackgroundWorker bw = new BackgroundWorker();
EventHandler HandleStuff = delegate { MessageBox.Show("HandleStuff called"); };
timer.Tick += HandleStuff;
bw.RunWorkerCompleted += HandleStuff;

Последняя строка не разрешена, потому что:

Невозможно неявно преобразовать тип System.EventHandler в System.ComponentModel.RunWorkerCompletedEventHandler.

2 вопроса: почему RunWorkerCompleted не может принять обычный EventHandler - завершенное событие не является многопоточным, есть ли причина, по которой существует это ограничение?

Что еще более важно, есть ли обходной путь для достижения этого? Я хочу использовать один и тот же обработчик для Timer.Tick и bw.RunWorkerCompleted


person Jesse Adam    schedule 20.06.2014    source источник
comment
1) затем замените HandleStuff чем-то, кроме args (sender, args) => { MessageBox ....}; 2) точно такая же причина. 3) -1   -  person eran otzap    schedule 20.06.2014
comment
RTFM   -  person tnw    schedule 20.06.2014
comment
Эта страница msdn объясняет, почему я не могу использовать обычный обработчик событий (потому что ему нужно, чтобы обработчик принимал RunWorkerCompletedEventArgs), однако она вообще не отвечает на мой второй вопрос.   -  person Jesse Adam    schedule 20.06.2014


Ответы (1)


Почему RunWorkerCompleted не может принять обычный EventHandler?

Потому что подпись не соответствует событию. (И делегат не эквивалентен из-за ко/противовариантности). Обработчик всегда должен быть того же типа, что и делегат события, по определению.

Что еще более важно, есть ли обходной путь для достижения этого?

Вы не сможете прикрепить именно этот обработчик с точки зрения этой точной ссылки, нет. Лучшее, что вы можете сделать, это создать новый обработчик событий соответствующего типа, тело которого ничего не делает, кроме вызова кода, который вы действительно хотите, чтобы он выполнялся:

bw.RunWorkerCompleted += (s,args)=> HandleStuff(s,EventArgs.Empty);
person Servy    schedule 20.06.2014