为什么此Action事件为null?

时间:2011-07-15 07:53:21

标签: c# events

我目前有2个WinForms。

FormA 会创建 FormB 的实例。我将 FormB ShowDialog()方法称为。

FormB 定义public event Action<SomeClass, string> Analyze

当我点击 FormB ProcessEvent 按钮时,我会执行以下操作:

Action<SomeClass, string> tempAction = Analyze;
if (tempAction != null)
{
  tempAction.Invoke(instanceOfSomeClass, someString);
}

但是未调用该事件,因为 tempAction 为null。

为什么会为空?

我在 FormA 中以相同的方式定义事件,它们工作正常。

编辑:

我有一个订阅该活动的演示者类:

formBInstance.Analyze += StartAnalyze

2 个答案:

答案 0 :(得分:6)

你必须签署活动。如果没有订阅者,则分析将为空

FormB form = new FormB();
form.Analyze += OnAnanlyze; // define callback function

答案 1 :(得分:2)

其他人回答了你原来的问题。我只想添加一些你应该考虑的要点。

事件初始化程序

首先,您可以使用`delegate {}'作为所有事件的初始化程序,以便能够跳过空检查并使事件线程安全。

示例:

public class MyClass
{
    public event EventHandler<TempActionArgs> TempAction = delegate {};
}

通过这种方式,您只需使用

即可调用它
TempAction(this, new TempActionArgs(someStrings);

无需任何检查。

使用标准事件机制

不要将Action<>用于活动。使用标准EventHandler / EventArgs机制使您的应用程序看起来像任何其他.NET应用程序。 imho Action<>应仅用于临时调用(而不是在对象生存期间)。 LINQ方法就是一个很好的例子。