重复:如何确保事件仅订阅一次 并且已添加事件处理程序?
我有一个提供一些服务的单例,我的类挂钩到它上面的一些事件,有时一个类挂起两次事件然后被调用两次.我正在寻找一种经典的方法来防止这种情况发生.不知怎的,我需要检查一下我是否已经迷上了这个事件......
我想确保我只在特定的类中为一个实例上的事件订阅一次.
例如,我希望能够做到以下几点:
if (*not already subscribed*)
{
member.Event += new MemeberClass.Delegate(handler);
}
Run Code Online (Sandbox Code Playgroud)
我该如何实施这样的警卫?
与此问题相关, 检查事件是否已存在
但不同之处在于我只想知道某个特定方法是否附加到事件中.所以可能还有其他方法,但我只想知道是否存在特定的方法.
我的环境是dotnet 4.0中的C#.
例如
Event += MyMethod1;
Event += MyMethod2;
// Some code
if (MyMethod1IsAttachedToEvent())
{
// Achieved goal
}
Run Code Online (Sandbox Code Playgroud)
这可能吗?
如果我有经典的方式注册和取消注册事件(+ = - =),还有一种方法可以查看是否立即注册了某些内容吗?
假设我有两种方法可以在一个Timer上注册.如果已经注册了某些内容.Elapsed,我不想要任何其他内容进行注册(并且不希望多次注册).
有没有办法查找当前注册的特定事件的方法?
这是一个虚构的例子,但是我在游荡如果InitialiseTimer函数被调用两次会发生什么.计时器已用完的功能是否被触发两次.如果函数是静态的,这会改变吗?
private static void InitialiseTimer()
{
TheTimer = new System.Timers.Timer();
TheTimer.Interval = 400;
TheTimer.Elapsed += new ElapsedEventHandler(TheTimer_Elapsed);
TheTimer.AutoReset = false;
}
public void TheTimer_Elapsed(object sender, ElapsedEventArgs e)
{
//Do stuff in here
}
Run Code Online (Sandbox Code Playgroud)
我打算用下面来防止这种情况发生
谢谢,理查德
这个问题询问是否有办法找到代码是否已经为事件添加了自己的事件处理程序.但是,给出的答案只能在拥有该事件的同一个类中进行.(Delegate.GetInvocationList等.)
我想为AppDomain.CurrentDomain.AssemblyResolve添加自定义事件处理程序.有没有办法在再次添加之前找出我的自定义处理程序是否已添加?(对于此标准库事件和其他标准库事件.)
如果答案确实是"那是不可能的".那么请把它作为答案.