C#BackgroundWorker将System.EventHandler添加到RunWorkerCompleted

时间:2014-06-20 15:34:02

标签: c# delegates backgroundworker eventhandler

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

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

  

无法隐式转换类型' System.EventHandler' to' System.ComponentModel.RunWorkerCompletedEventHandler'

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

更重要的是,有没有可以实现这一目标?我想对Timer.Tickbw.RunWorkerCompleted

使用相同的处理程序

1 个答案:

答案 0 :(得分:1)

  

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

因为签名与事件不匹配。 (并且代表通过co / contra-variance不等同)。根据定义,处理程序总是需要与事件的委托类型相同。

  

更重要的是,有没有可以实现这一目标?

根据确切的参考,你将无法附加那个确切的处理程序,没有。你能做的最好的事情就是创建一个适当类型的新事件处理程序,除了调用你真正希望它执行的代码之外,它除了调用你真正希望它执行的代码之外什么都不做:

bw.RunWorkerCompleted += (s,args)=> HandleStuff(s,EventArgs.Empty);