【问题标题】:C# BackgroundWorker Add System.EventHandler to RunWorkerCompletedC# BackgroundWorker 将 System.EventHandler 添加到 RunWorkerCompleted
【发布时间】:2014-06-20 15:34:02
【问题描述】:
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.Tickbw.RunWorkerCompleted 使用相同的处理程序

【问题讨论】:

  • 1 ) 然后用除了 args (sender, args) => { MessageBox ....}; 2)同样的确切原因。 3) -1
  • 那个 msdn 页面确实解释了为什么我不能使用常规事件处理程序(因为它需要处理程序来接受 RunWorkerCompletedEventArgs),但是它根本没有解决我的第二个问题。

标签: c# delegates backgroundworker eventhandler


【解决方案1】:

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

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

更重要的是,是否有解决办法来实现这一点?

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 2011-08-31
    • 1970-01-01
    相关资源
    最近更新 更多