避免在C#中重复的事件订阅

Sco*_*ate 19 c# events delegates event-handling

您如何建议避免重复事件订阅的最佳方法?如果这行代码在两个地方执行,则该事件将运行两次.我试图避免第三方事件订阅两次.

theOBject.TheEvent += RunMyCode;
Run Code Online (Sandbox Code Playgroud)

在我的委托制定者中,我可以有效地运行这个......

theOBject.TheEvent -= RunMyCode;
theOBject.TheEvent += RunMyCode;
Run Code Online (Sandbox Code Playgroud)

但这是最好的方法吗?

Jos*_*lio 20

我认为,最有效的方法是使您的事件成为属性并为其添加并发锁,如下例所示:

private EventHandler _theEvent;
private object _eventLock = new object();
public event EventHandler TheEvent
{
    add
    {
        lock (_eventLock) 
        { 
            _theEvent -= value; 
            _theEvent += value; 
        }
    }
    remove
    {
        lock (_eventLock) 
        { 
           _theEvent -= value; 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 戴夫莫顿改变了他的领域.新网址是:http://codinglight.blogspot.com/2009/02/preventing-duplicate-subscriptions-to.html (2认同)

小智 5

我之前做过这个....它假设最后一个订阅者被调用是可以接受的.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            MyObject my = new MyObject();
            my.Changed += new EventHandler(my_Changed);
            my.Changed += new EventHandler(my_Changed1);

            my.Update();
            Console.ReadLine();
        }

        static void my_Changed(object sender, EventArgs e)
        {
            Console.WriteLine("Hello");
        }
        static void my_Changed1(object sender, EventArgs e)
        {
            Console.WriteLine("Hello1");
        }
    }
    public class MyObject
    {
        public MyObject()
        {
        }
        private EventHandler ChangedEventHandler;
        public event EventHandler Changed
        {
            add
            {
                ChangedEventHandler = value;
            }
            remove
            {
                ChangedEventHandler -= value;
            }
        }
        public void Update()
        {
            OnChanged();
        }

        private void OnChanged()
        {
            if (ChangedEventHandler != null)
            {
                ChangedEventHandler(this, null);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 很高兴,对于那些可能错过它的速度读者来说,这是重要的路线.ChangedEventHandler = value; 而不是+ =.仅适用于一次性使用 - 在某些情况下可能对我有用 - 谢谢! (5认同)