我向一个事件添加了一个方法,但现在想在某些条件下删除在这些事件上运行的方法:
public MyClassConstructor()
{
otherClassObj.OnMyDataReceived += new EventHandler(analyzeValues);
}
private void analyzeValues(object sender, EventArgs e)
{
// finished analysis
otherClassObj.OnMyDataReceived -= analyzeValues;
}这似乎会使程序崩溃,但我不明白为什么。这是我的第一个C#程序。谢谢。
发布于 2013-04-13 02:27:33
确保您的事件访问器为written aproprately。它应该看起来像这样:
private EventHandler onMyDataReceived;
public event EventHandler OnMyDataReceived
{
add
{
lock (OnMyDataReceived)
{
onMyDataReceived += value;
}
}
remove
{
lock (OnMyDataReceived)
{
onMyDataReceived -= value;
}
}
}另外,考虑使用下面的代码来添加事件处理程序:
otherClassObj.OnMyDataReceived += analyzeValues;发布于 2013-04-13 02:40:12
也许你的问题在于你举办活动的方式?您必须首先将事件背后的当前委托复制到局部变量,然后检查它是否为空,然后才调用它。如下所示:
var omdr = OnMyDataReceived;
if (omdr != null)
omdr(this, new EventArgs());发布于 2013-04-13 02:33:02
以下应用程序演示了如何订阅和取消订阅事件。您可以将此代码放入新的控制台应用程序中以运行它。
它显示第一次引发事件时,事件处理程序将被调用,然后取消订阅自身。第二次,不再订阅任何处理程序,并且什么也不会发生。
using System;
class Program
{
static void Main(string[] args)
{
MyClass c = new MyClass();
Console.WriteLine("Ready..");
Console.ReadLine();
}
}
public class MyClass
{
OtherClass otherClassObj = new OtherClass();
public MyClass()
{
Console.WriteLine("Class constructor.. adding event");
otherClassObj.OnMyDataReceived += analyzeValues;
Console.WriteLine("Raising event 1");
otherClassObj.Raise();
Console.WriteLine("Raising event 2");
otherClassObj.Raise();
}
private void analyzeValues(object sender, EventArgs e)
{
Console.WriteLine("Event handler");
Console.WriteLine("Removing event");
otherClassObj.OnMyDataReceived -= analyzeValues;
}
}
public class OtherClass
{
public event EventHandler OnMyDataReceived;
public void Raise()
{
if (OnMyDataReceived != null)
{
OnMyDataReceived(this, EventArgs.Empty);
}
}
}https://stackoverflow.com/questions/15978331
复制相似问题