如何获取事件的目标

本文关键字:事件 目标 获取 何获取 | 更新日期: 2023-09-27 18:15:37

我有一个事件要触发,名为ValueGenerated。生成值并触发ValueGenerated的代码在线程中运行,而接收此事件的方法在表单中。控件(即窗体)。由于UI线程不允许其他线程更改UI,我在事件生成上编写了以下代码:

if (ValueGenerated.Target is System.windows.form.control)
{
Control targetForm = ValueGenerated.Target as control;
targetForm.Invoke(ValueChanged,new object[]{this,args});
}

但是我认为如果事件被多个方法注册会发生什么。例如,两个或三个目的地。为什么在事件和委托类中,我们只有Target属性,它返回最后添加的方法的实例对象?我们总是只需要最后一个吗?

如何获取事件的目标

你做错了。

如注释中所述,您可以通过在委托实例上调用GetInvocationList()来获得调用目标的完整列表。然后,您可以单独调用每个目标。

但是这是不是正确的方法。你的事件应该以相同的方式对待所有的处理程序。

如果事件是在后台线程中总是引发的事件,并且总是由UI对象处理,那么它应该总是使用适当的机制来分派给UI线程。参见BackgroundWorker类以获得此类设计的示例,特别是其ProgressChangedRunWorkerCompleted事件。

如果这些条件中的任何一个不为真,那么您的事件不应该尝试以任何方式处理跨线程调用。具有线程关联的事件的订阅者应该自己处理。

不幸的是,你的问题没有足够的上下文来提供比这更具体的建议。唯一清楚的是,你已经走上了一条死路。转过身来,走一条更平坦的路。:)