2010-03-19 92 views
0

我加入了一个事件处理这样的:如何确保没有处理程序附加到事件?

theImage.MouseMove += new MouseEventHandler(theImage_MouseMove); 

,但在我的应用程序,该代码获取运行页面显示每次,所以我要附加的事件处理程序只一次 ,但我怎么能告诉我们,如果一个处理器已设置但还是不行,像这样:

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

Dupe:http://stackoverflow.com/questions/1129517/c-how-to-find-if-an-event-is-hooked-up – 2010-03-19 16:25:04

+0

@Jason:爱德华只关心确保事件不是'不止一次,所以爱德华问题的解决方案是不同的。 – Brian 2010-03-19 16:33:22

+1

@Brian::s/Dupe /相关 – 2010-03-19 16:37:46

回答

1

我也许我失去了一些东西,但如果你举st想要确保句柄只被调用一次,为什么不在添加之前使用-=。类似这样的:

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

可以缩短下来,如果你只是要附加一次:

theImage.MouseMove -= theImage_MouseMove; //If it wasn't attached, doesn't matter 
theImage.MouseMove += theImage_MouseMove; 
-1
theImage.MouseMove.GetInvocationList().Length 
+0

这不起作用:http://stackoverflow.com/questions/1129517/c-how-to-find-if-an-event-is-hooked-up/1129530#1129530 – 2010-03-19 16:31:33

+0

对我来说,它返回3(但没有用mousemove测试它) public static EventHandler ee; static void Main(string [] args) ee + =(s,e)=> {}; ee + =(s,e)=> {}; ee + =(s,e)=> {}; Console.WriteLine(ee.GetInvocationList()。Count()); Console.Read(); } – UshaP 2010-03-19 16:42:42

+0

这是因为您直接在ee委托上工作,而不是由另一个类发布的事件。 – 2010-03-19 16:54:54

1

我不知道这是否是最好的解决办法,但我通常这样做的方法是简单地使用在订阅之前取消订阅。

如果你做这样的事情:

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

它仅会被添加一次。如果它尚不存在(第一次触发),如果以前没有订阅, - =不会伤害任何东西。

相关问题