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)
小智 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)