c# - 在运行时重新分配事件处理程序

标签 c# delegates event-handling

我想在运行时更改附加到 BackgroundWorker 的委托(delegate)。像下面这样的东西行得通吗?

DoWorkEvenHandler dweh = new DoWorkEventHandler(method1);
backgroundworker.DoWork += dweh;

稍后通过重新分配引用 dweh 来更改与 DoWork 关联的委托(delegate):

dweh = new DoWorkEventHandler(method2);

最佳答案

不,您不能将委托(delegate)“分配”给事件处理程序。通过将处理程序添加到在内部用于表示事件的底层委托(delegate)的调用列表中,处理程序附加到事件。这是设计使然!

不,您不能通过更改以前用于附加事件处理程序的引用所指向的对象来更改处理程序;部分原因是委托(delegate)是不可变的,部分原因是您只是将引用更改为指向其他内容,而不是真正更改您要完成的事件处理程序。

为了更改委托(delegate),您必须先删除之前的委托(delegate):

backgroundworker.DoWork -= dweh;

然后通过将其添加为事件的处理程序来分配一个新的:

backgroundworker.DoWork += new DoWorkEventHandler(method2);

注意

在大多数情况下,您可以使用以下语法从事件中删除处理程序(委托(delegate)):

backgroundworker.DoWork -= new DoWorkEventHandler(mehtod1);

或使用隐式或显式方法组转换:

backgroundworker.DoWork -= (DoWorkEventHandler)mehtod1;  // explicit convertion    
//  -  or  - 
backgroundworker.DoWork -= mehtod1;                      // implicit (more compact)

但根据情况,您可能需要维护对前一个委托(delegate)的引用,以便以后能够将其删除。例如,这将适用于匿名方法或 lambda 表达式。

关于c# - 在运行时重新分配事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15210553/

相关文章:

c# - 将特定异常作为默认值传递

asp.net - ASP :Button Click event not being fired

c++ - 控制台未聚焦时如何检测按键

c# - 从 Controller 下载文件

c# - Timespan(0,0,secs) 或 Timespan.FromSeconds(secs)

c# - Cache.Insert 的委托(delegate)

ios - 如何创建具有符合通用协议(protocol)的弱委托(delegate)的基类?

c# - 如何以正确的方式使用委托(delegate)/了解委托(delegate)

应用程序池的 C# .NET 单例生活

c# - 委派任务并在任务完成时收到通知(在 C# 中)