【问题标题】:Add an event to a object & handle it向对象添加事件并处理它
【发布时间】:2011-04-26 12:16:57
【问题描述】:

我有一个要在特定时间间隔内更新的内存流对象。

当内存流对象发生更新时,应该创建并引发该事件。 然后应该有一个事件处理程序来处理引发的事件。

请为参考建议任何代码或示例。

提前致谢。

【问题讨论】:

    标签: c# events event-handling


    【解决方案1】:

    你知道事件的逻辑吗?

    如果是这样,请在您的内存流将被更新的类中创建一个事件。 更新时,引发事件。

    在类的消费者处注册事件。

    而且,基本上,就是这样?

    也许您的疑问是一般事件。为此,我建议您阅读 MSDN,例如

    【讨论】:

      【解决方案2】:

      有几种方法可以解决这个问题。

      最简单的方法是那个刚刚打败我的人建议的方法,而不是直接调用 MemoryStream.Write(),而是在你的应用程序中编写一个调用 MemoryStream.Write() 的方法,然后调用一个事件您在 MemoryStream 对象之外声明自己。

      在更奇特但更简洁的角落,您可以大胆地从 MemoryStream 继承一个类,在该类中添加一个事件属性并覆盖 Write() 方法(或您调用的任何用于写入的方法)调用基类 Write() 方法,然后引发事件。有些人可能会采用这种方法,它可能不太理想或存在问题,具体取决于您使用 MemoryStream 的方式,但它会完成您想要的工作,并且让您不必在每次编写时都自己引发事件。

      【讨论】:

      • +1。我也想建议重写 Write() 方法,在我看来这将是最正确的方法
      【解决方案3】:

      可以在http://www.switchonthecode.com/tutorials/csharp-snippet-tutorial-custom-event-handlers 找到有关注册和引发自定义事件的一个很好的示例

      更新:链接已损坏,我使用archive.org 从那里引用(更改了事件引发部分以避免竞争条件):

      using System;
      
      namespace CustomEvents
      {
        public class Car
        {
          public delegate void OwnerChangedEventHandler(string newOwner);
          public event OwnerChangedEventHandler OwnerChanged;
      
          private string make;
          private string model;
          private int year;
          private string owner;
      
          public string CarMake
          {
            get { return this.make; }
            set { this.make = value; }
          }
      
          public string CarModel
          {
            get { return this.model; }
            set { this.model = value; }
          }
      
          public int CarYear
          {
            get { return this.year; }
            set { this.year = value; }
          }
      
          public string CarOwner
          {
            get { return this.owner; }
            set
            {
              this.owner = value;
              // To avoid race condition
              var ownerchanged = this.OwnerChanged;
              if (ownerchanged != null)
                ownerchanged(value);
            }
          }
      
          public Car()
          {
          }
        }
      }
      

      【讨论】:

      • 感谢您找到数据并将其包含在答案中!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-21
      • 2015-09-08
      相关资源
      最近更新 更多