C# 事件获取/丢失侦听器时是否存在事件?

C# 事件获取/丢失侦听器时是否存在事件?,c#,events,.net-3.5,C#,Events,.net 3.5,可能重复: 搜索有关事件的信息并不容易。我只是希望这不是因为做不到。我只是希望答案是“有这样的事件”,或者其他方式 我正在处理的一个事件是,收听该事件的费用相对较高。(在我正在连接的另一个系统中,必须在其上安装一块手表,包括跟踪要跟踪的内容和通信开销。) 因此,除非我知道有什么东西想要看,否则我真的不想看比赛 这样做的简单方法如下: public class MyThing { public delegate void MyEventHandler(object sender, MyE

可能重复:

搜索有关事件的信息并不容易。我只是希望这不是因为做不到。我只是希望答案是“有这样的事件”,或者其他方式

我正在处理的一个事件是,收听该事件的费用相对较高。(在我正在连接的另一个系统中,必须在其上安装一块手表,包括跟踪要跟踪的内容和通信开销。)

因此,除非我知道有什么东西想要看,否则我真的不想看比赛

这样做的简单方法如下:

public class MyThing
{
    public delegate void MyEventHandler(object sender, MyEventArgs ea);
    public event MyEventHandler Change;

    public void StartWatching()
    {
        ...
    }

    public void StopWatching()
    {
        ...
    }
}
其使用方式如下:

var thing = new MyThing();
thing.Change += this.thing_Change
thing.StartWatching();

thing.Change -= this.thing_Change
thing.StopWatching();  // Hopefully nothing else is watching...
但这不是我想要的那么优雅。我可以用
thing.Change+=x
替换为
thing.StartWatching(x)
,然后开始观看,反之则检查
Change==null
,但我希望它是否可以用事件模型的完整优雅来完成。

听起来可能是您想要的

int count = 0;

event EventHandler MyThing.Change
{
    add
    {
        lock (Change)
        {
            if (count == 0)
            {
                StartWatching();
            }

            count++;
            Change += value;
        }
    }
    remove
    {
        lock (Change)
        {
            count--;
            if (count == 0)
            {
                StopWatching();
            }

            Change -= value;
        }
    }
}
听起来像是一个可能是你正在寻找的

int count = 0;

event EventHandler MyThing.Change
{
    add
    {
        lock (Change)
        {
            if (count == 0)
            {
                StartWatching();
            }

            count++;
            Change += value;
        }
    }
    remove
    {
        lock (Change)
        {
            count--;
            if (count == 0)
            {
                StopWatching();
            }

            Change -= value;
        }
    }
}

尝试将事件声明为属性并使用添加/删除访问器

class YourClass
{
    public event EventHandler<EventArgs>  MyEvent
    {
        add
        {
            // Add new subscriber code here
        }

        remove
        {
            // Remove subscriber code here
        }
    }
}
classyourclass
{
公共事件处理程序MyEvent
{
添加
{
//在此处添加新的订户代码
}
去除
{
//在此处删除订户代码
}
}
}

尝试将事件声明为属性,并使用添加/删除访问器

class YourClass
{
    public event EventHandler<EventArgs>  MyEvent
    {
        add
        {
            // Add new subscriber code here
        }

        remove
        {
            // Remove subscriber code here
        }
    }
}
classyourclass
{
公共事件处理程序MyEvent
{
添加
{
//在此处添加新的订户代码
}
去除
{
//在此处删除订户代码
}
}
}

您可以覆盖事件的添加/删除方法,并在那里执行工作

public class MyThing
{
    public delegate void MyEventHandler(object sender, MyEventArgs ea);

    private MyEventHandler _change;
    public event MyEventHandler Change
    {
       add 
      { 
          var previousChange = _change;
          _change += value; 
          if (previousChange == null)
          {
             StartWatching();
          }
       }
       remove 
       { 
          _change -= value;
          if (_change == null) 
          {
             StopWatching();
          }
       }
    }

    public void StartWatching()
    {
        ...
    }

    public void StopWatching()
    {
        ...
    }
}

目前,这不是线程安全的,但您可以轻松做到这一点。

您可以覆盖事件的添加/删除方法,并在那里执行工作

public class MyThing
{
    public delegate void MyEventHandler(object sender, MyEventArgs ea);

    private MyEventHandler _change;
    public event MyEventHandler Change
    {
       add 
      { 
          var previousChange = _change;
          _change += value; 
          if (previousChange == null)
          {
             StartWatching();
          }
       }
       remove 
       { 
          _change -= value;
          if (_change == null) 
          {
             StopWatching();
          }
       }
    }

    public void StartWatching()
    {
        ...
    }

    public void StopWatching()
    {
        ...
    }
}

目前,这不是线程安全的,但您可以轻松做到这一点。

。。。在寻找了很久之后,我发现有人需要做一个全文搜索引擎,让你写段落而不是文字。哟,老兄,我听说你喜欢活动,所以我在你的事件中放了一个事件,这样你就可以边听边听了。@christmorger,这在我身上发生过几次,搜索时会产生大量噪音。别担心,典型的。。。在寻找了很久之后,我发现有人需要做一个全文搜索引擎,让你写段落而不是文字。哟,老兄,我听说你喜欢活动,所以我在你的事件中放了一个事件,这样你就可以边听边听了。@christmorger,这在我身上发生过几次,搜索时会产生大量噪音。别担心。