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

lgp*_*lgp 4 c# delegates event-handling

我想BackgroundWorker在运行时更改附加到的委托.下面的东西会起作用吗?

DoWorkEvenHandler dweh = new DoWorkEventHandler(method1);
backgroundworker.DoWork += dweh;
Run Code Online (Sandbox Code Playgroud)

并在某些时候DoWork通过重新分配引用来更改与之关联的委托dweh:

dweh = new DoWorkEventHandler(method2);
Run Code Online (Sandbox Code Playgroud)

Mik*_*scu 8

不,你不能"委派"委托给事件处理程序.处理程序通过将事件添加到内部用于表示事件的基础委托的调用列表来附加到事件.这是设计的!

不,您不能通过更改先前用于附加事件处理程序的引用所指向的对象来更改处理程序; 部分原因是委托是不可变的,部分是因为你只是将引用更改为指向别的东西,而不是真正改变你想要完成的事件处理程序.

更改委托,您必须先删除以前的委托:

backgroundworker.DoWork -= dweh;
Run Code Online (Sandbox Code Playgroud)

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

backgroundworker.DoWork += new DoWorkEventHandler(method2);
Run Code Online (Sandbox Code Playgroud)

注意

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

backgroundworker.DoWork -= new DoWorkEventHandler(mehtod1);
Run Code Online (Sandbox Code Playgroud)

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

backgroundworker.DoWork -= (DoWorkEventHandler)mehtod1;  // explicit convertion    
//  -  or  - 
backgroundworker.DoWork -= mehtod1;                      // implicit (more compact)
Run Code Online (Sandbox Code Playgroud)

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