相关疑难解决方法(0)

是否已添加事件处理程序?

有没有办法判断是否已将事件处理程序添加到对象中?我正在将对象列表序列化为进入/退出会话状态,因此我们可以使用基于SQL的会话状态...当列表中的对象更改了属性时,需要对其进行标记,事件处理程序在此之前正确处理.但是现在当对象被反序列化时,它没有得到事件处理程序.

在轻微的烦恼中,我刚刚将事件处理程序添加到访问该对象的Get属性中.它现在被调用,这很好,除了它被调用5次,所以我认为处理程序只是在每次访问对象时都会被添加.

它真的很安全,只是忽略,但我宁愿通过检查处理程序是否已被添加来使它更清洁,所以我只这样做了一次.

那可能吗?

编辑:我不一定完全控制添加什么事件处理程序,所以只检查null是不够的.

.net c# asp.net

173
推荐指数
6
解决办法
13万
查看次数

C#模式防止事件处理程序挂钩两次

重复:如何确保事件仅订阅一次 并且已添加事件处理程序?

我有一个提供一些服务的单例,我的类挂钩到它上面的一些事件,有时一个类挂起两次事件然后被调用两次.我正在寻找一种经典的方法来防止这种情况发生.不知怎的,我需要检查一下我是否已经迷上了这个事件......

c# delegates event-handling

93
推荐指数
6
解决办法
9万
查看次数

多次阻止相同的事件处理程序分配

如果我在运行时分配事件处理程序并且它位于可以多次调用的位置,那么建议的做法是防止同一处理程序多次分配给同一事件.

object.Event += MyFunction
Run Code Online (Sandbox Code Playgroud)

在一个将被多次调用的位置添加它将执行处理程序'n'次(当然).

在尝试添加via之前,我已经尝试删除任何先前的处理程序

object.Event -= MyFunction; 

object.Event += MyFunction;
Run Code Online (Sandbox Code Playgroud)

这可行,但似乎不知何故.有关正确处理的任何建议;)此方案.

c# events

45
推荐指数
1
解决办法
2万
查看次数

如何从一种类型的多个实例中禁用对事件的订阅,并且只允许一个?

我有一个主窗体的Windows窗体应用程序(从基础派生Form).可以在那里打开的其他模态形式来自我的类ManagedForm,它也来自Form.
此外,我有一个静态通知程序服务,它会触发这样的事件:

    public static class NotifierService
    {
        public delegate void NotifierServiceEventHandler(object sender, NotifierServiceEventArgs e);

        private static readonly object Locker = new object();
        private static NotifierServiceEventHandler _notifierServiceEventHandler;

        #region Events

        public static event NotifierServiceEventHandler OnOk
        {
            add
            {
                lock (Locker)
                {
                    _notifierServiceEventHandler += value;

                    if (
                        _notifierServiceEventHandler.GetInvocationList()
                                                    .Count(
                                                        _ =>
                                                        _.Method.DeclaringType != null &&
                                                        value.Method.DeclaringType != null &&
                                                        _.Method.DeclaringType == value.Method.DeclaringType) <= 1)
                        return;

                    _notifierServiceEventHandler -= value;
                }
            }
            remove
            {
                lock (Locker)
                {
                    _notifierServiceEventHandler -= …
Run Code Online (Sandbox Code Playgroud)

.net c# events delegates winforms

9
推荐指数
2
解决办法
589
查看次数

C#:线程安全事件

下面的实现是否是线程安全的?如果不是我错过了什么?我应该在volatile某个地方有关键字吗?或者在OnProcessingCompleted方法的某个地方锁定?如果是的话,在哪里?

public abstract class ProcessBase : IProcess
{
    private readonly object completedEventLock = new object();

    private event EventHandler<ProcessCompletedEventArgs> ProcessCompleted;

    event EventHandler<ProcessCompletedEventArgs> IProcess.ProcessCompleted
    {
        add
        {
            lock (completedEventLock)
                ProcessCompleted += value;
        }
        remove
        {
            lock (completedEventLock)
                ProcessCompleted -= value;
        }
    }

    protected void OnProcessingCompleted(ProcessCompletedEventArgs e)
    {
        EventHandler<ProcessCompletedEventArgs> handler = ProcessCompleted;
        if (handler != null)
            handler(this, e);
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:我有私有事件和显式接口的原因是因为它是一个抽象基类.从它继承的类不应该直接对该事件做任何事情.添加了类包装器,使其更清晰=)

c# events multithreading event-handling thread-safety

5
推荐指数
2
解决办法
5578
查看次数