我目前有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
答案 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方法就是一个很好的例子。