如何确保没有处理程序附加到事件?

时间:2010-03-19 16:20:38

标签: c# events event-handling

我正在添加事件处理程序,如下所示:

theImage.MouseMove += new MouseEventHandler(theImage_MouseMove);

但在我的应用程序中,此代码会在每次页面显示时运行,因此我只想附加一次的事件处理程序,但如何才能我告诉是否已经设置了处理程序,如下所示:

if(theImage.MouseMove == null) //error
    theImage.MouseMove += new MouseEventHandler(theImage_MouseMove);

4 个答案:

答案 0 :(得分:1)

我可能会遗漏一些东西,但是如果你只是想确保只调用一次句柄,为什么不在添加它之前使用-=。像这样:

public static void Main(string[] args)
{
    var timer = new Timer(1000);

    timer.Elapsed -= new ElapsedEventHandler(timer_Elapsed);
    timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
    timer.Elapsed -= new ElapsedEventHandler(timer_Elapsed);
    timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);

    timer.Start();

    System.Threading.Thread.Sleep(4000);
}

static void timer_Elapsed(object sender, ElapsedEventArgs e)
{
    Console.WriteLine("Hit!");
}

处理程序每​​秒只运行一次。

答案 1 :(得分:1)

如果您只想附加一次,可以缩短它:

theImage.MouseMove -= theImage_MouseMove; //If it wasn't attached, doesn't matter
theImage.MouseMove += theImage_MouseMove;

答案 2 :(得分:1)

我不确定这是否是最佳解决方案,但我通常这样做的方法是在订阅之前简单地使用取消订阅。

如果您执行以下操作:

TheImage.MouseMove -= new MouseEventHandler(theImage_MouseMove);
TheImage.MouseMove += new MouseEventHandler(theImage_MouseMove);

它只会被添加一次。如果它尚未存在(第一次被触发), - =如果之前没有订阅,则不会伤害任何内容。

答案 3 :(得分:-1)

theImage.MouseMove.GetInvocationList().Length