我想在运行时更改附加到 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/