0
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

4

1 回答 1

1

为什么 RunWorkerCompleted 不能接受常规的 EventHandler?

因为签名与事件不匹配。(并且委托不是通过协方差等价的)。根据定义,处理程序始终需要与事件委托的类型相同。

更重要的是,是否有解决方法来实现这一目标?

就该确切参考而言,您将无法附加该确切的处理程序,不。您可以做的最好的事情是创建一个适当类型的新事件处理程序,它的主体除了调用您实际希望它执行的代码之外什么都不做:

bw.RunWorkerCompleted += (s,args)=> HandleStuff(s,EventArgs.Empty);
于 2014-06-20T16:52:07.937 回答