如何编写触发器?

时间:2011-08-22 20:37:49

标签: c# multithreading events

每当为我的对象赋值时,我希望我的C#代码调用一个事件。

我究竟需要怎么做呢?

class MyClass {

  ManualResetEvent mre;

  public MyClass() {
    mre = new ManualResetEvent(false);
    Data = null;
  }

  public object Data { get; set; }

  void DataSet(object sender, EventArgs e) {
    Console.WriteLine("object Data has been set.");
    mre.Set();
  }

}

代表似乎不是我需要的。也许是一个事件?如果是这样,我将如何撰写此类活动?

MyClass mc;

void processA() {
  mc = new MyClass();
  mc.Data = GetDataFromLongProcess();
}

6 个答案:

答案 0 :(得分:5)

private object data;
public object Data {
    get { return data;}
    set {
        if(value != data) {
            data = value;
            OnDataChanged();
        }
    }
}
protected virtual void OnDataChanged() {
    EventHandler handler = DataChanged;
    if(handler != null) handler(this, EventArgs.Empty);
}
public event EventHandler DataChanged;

然后将任何代码挂钩到DataChanged事件。例如:

MyClass mc = ...
mc.DataChanged += delegate {
    Console.WriteLine("new data! wow!");
};

答案 1 :(得分:2)

如果您想在设置属性时触发事件,则可以执行以下操作:

 public event Action OnDataChanged;

 protected object _data = null;
 public object Data
 {
     get { return _data; }
     set
     {
         _data = value;
         if(OnDataChanged != null)
            OnDataChanged();
     }
 }

然后,您只需将事件处理程序连接到您的对象,如下所示:

 mc = new MyClass();
 mc.OnDataChanged += delegate() { Console.WriteLine("It changed!"); };
 mc.Data = SomeValue();

答案 2 :(得分:2)

我认为你在基于事件的模型上走在正确的轨道上。还要看一下Observer模式(根据我的理解,它是.Net委托和事件的基础),所有这些都是:

http://www.dofactory.com/Patterns/PatternObserver.aspx

但是底线,作为迄今为止另一个有用的答案(Gravell先生的实现)表明,你将不得不使用代码 IN 设置器来连接它。唯一的选择是轮询变化的价值,这对我来说闻起来很糟糕。

答案 3 :(得分:1)

你可以实现INotifyPropertyChanged(这或多或少是一个事件),或者你可以把你的类作为一个Action(Trigger)并在属性改变时调用它。

只是不要使用自动属性,而是使用具体的设置器并从那里调用事件/触发器。

答案 4 :(得分:1)

从概念上讲,您将在类中定义一个事件,并在属性集块中,使用必要的参数调用事件以确定刚刚发生的事件。

答案 5 :(得分:1)

 public event SomeDelegateThatTakesIntAsParameter myEvent;
 void SetData(int data)
 {
   if(myEvent!= null)
     myEvent(data)
 }