C#BackgroundWorker将System.EventHandler添加到RunWorkerCompleted

C#BackgroundWorker将System.EventHandler添加到RunWorkerCompleted,c#,delegates,backgroundworker,eventhandler,C#,Delegates,Backgroundworker,Eventhandler,不允许使用最后一行,因为: 无法将类型“System.EventHandler”隐式转换为“System.ComponentModel.RunWorkerCompletedEventHandler” 2个问题: 为什么RunWorkerCompleted不能接受常规EventHandler-已完成的事件不是多线程的,存在此限制的原因是什么 更重要的是,是否有办法实现这一目标?我想对Timer.Tick和bw.RunWorkerCompleted使用相同的处理程序 为什么RunWorkerComp

不允许使用最后一行,因为:

无法将类型“System.EventHandler”隐式转换为“System.ComponentModel.RunWorkerCompletedEventHandler”

2个问题: 为什么RunWorkerCompleted不能接受常规EventHandler-已完成的事件不是多线程的,存在此限制的原因是什么

更重要的是,是否有办法实现这一目标?我想对
Timer.Tick
bw.RunWorkerCompleted
使用相同的处理程序

为什么RunWorkerCompleted不能接受常规事件处理程序

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

更重要的是,是否有办法实现这一目标

您将无法附加该确切的处理程序,根据该确切的引用,不。您最好创建一个适当类型的新事件处理程序,该处理程序的主体只调用您实际希望它执行的代码:

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

1)然后将HandleStuff替换为除args(sender,args)=>{MessageBox…}之外的其他对象;2) 同样的道理。3) -1该msdn页面确实解释了为什么我不能使用常规事件处理程序(因为它需要处理程序接受RunWorkerCompletedEventArgs),但它根本没有解决我的第二个问题。
bw.RunWorkerCompleted += (s,args)=> HandleStuff(s,EventArgs.Empty);