C#BackgroundWorker将System.EventHandler添加到RunWorkerCompleted
不允许使用最后一行,因为: 无法将类型“System.EventHandler”隐式转换为“System.ComponentModel.RunWorkerCompletedEventHandler” 2个问题: 为什么RunWorkerCompleted不能接受常规EventHandler-已完成的事件不是多线程的,存在此限制的原因是什么 更重要的是,是否有办法实现这一目标?我想对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
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);