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

C# 如何确保没有处理程序附加到事件?,c#,events,event-handling,C#,Events,Event Handling,我正在添加一个事件处理程序,如下所示: theImage.MouseMove += new MouseEventHandler(theImage_MouseMove); public static void Main(string[] args) { var timer = new Timer(1000); timer.Elapsed -= new ElapsedEventHandler(timer_Elapsed); timer.Elapsed += new Ela

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

theImage.MouseMove += new MouseEventHandler(theImage_MouseMove);
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!");
}
但是在我的应用程序中,每次显示页面时,都会运行,因此我只想将事件处理程序附加一次,但是如何判断处理程序是否已设置,类似这样:

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

我可能遗漏了一些内容,但是如果您只想确保句柄只被调用一次,为什么不在添加它之前使用
-=
。大概是这样的:

theImage.MouseMove += new MouseEventHandler(theImage_MouseMove);
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!");
}

处理程序每秒只运行一次

如果只想连接一次,可以将其缩短:

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

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

如果您执行以下操作:

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

它只会被添加一次。如果它还不存在(第一次被触发),那么-=如果以前没有订阅过它,则不会造成任何影响。

Dupe:@Jason:Edward只关心确保事件不会被多次附加,因此Edward问题的解决方案是不同的。@Jason:称它为Dupe会带来更多的工作,因为它引诱我打开问题来验证它是否是一个dupe(为了投票关闭,如果它是一个dupe)。这不起作用:对我来说,它返回3(但没有使用mousemove测试它)公共静态事件处理程序ee;静态void Main(string[]args){ee+=(s,e)=>{};ee+=(s,e)=>{};ee+=(s,e)=>{};Console.WriteLine(ee.GetInvocationList().Count());Console.Read();}这是因为您直接处理ee委托,不是其他类发布的事件。那不是真的!!(抱歉缩进,我不知道怎么做)类程序{static void Main(string[]args){Class1 mc=new Class1();mc.ee+=(s,e)=>{};mc.ee+=(s,e)=>{};mc.ee+=(s,e)=>{};Console.WriteLine(mc.ee.GetInvocationList().Count());Console.Read();}}类Class1{public EventHandler ee;}但onmouse over是事件而不是委托这就是为什么没有GetInvocationList