C#.net事件处理程序委托问题

时间:2011-04-01 22:23:05

标签: c# .net events delegates

A类包含一个变量A,用于保存在C类(doEvent())中触发的事件的状态。线程休眠500毫秒,因为它等待B类启动一个Event,它将EventArg数据发送回C类并调用事件处理程序UpdateClassVar(EventArgs e) - 这就是它所等待的内容。

问题:如何使用事件处理程序触发依赖于状态更新的C类(//做某事)的下一步而不依赖于Thread.Sleep ... ??

免责声明:请考虑我是一名新手程序员。考虑这是我最好的尝试和一个相当不优雅的解决方案。请随意重新设计和重新编码,这应该被视为解决上述问题的唯一原型工作。

注意:代码示例编辑应该实际工作的“真实世界”示例。 (未完全测试)

附加问题 - 下面示例中的Thread.Sleep(400)会停止主线程...停止所有进程,虽然寻找替代方案,这是否是一个可行的解决方案?

 public class OrderA : ICurrencyOrder
 {
     private int _clid;

     private string _status;

     public int Clid
     {
         get { return _clid; }

         set { _clid = value; }
     }

     public string Status
     {
         get { return _status; }

         set { _status = value; }
     }

 }


 Class B
 {

      // event delegate for UpdateOrder

      public event UpdateOrderDelegate UpdateOrderEvent;

      /* Code Here to receive and process order assign status etc */

      /* An Event Arguments (args)  Class is created that hold e.Status and e.Clid values */

      UpdateOrder(args)

      private void UpdateOrder(args)
      {
           if (UpdateOrderEvent != null)
           {
               UpdateOrderEvent(this, e);
           }
      }

 }


// This is the class that initates the order (sendOrder()) and then waits for the 
// status of the order before processing the next step in the order process
// which could be to send order again to exit

 Class C
 {
      // add event handler to update status and clid from Class B

      UpdateOrderEvent += new UpdateOrderDelegate(UpdateOrdersListener);

      public void EnterOrder(EnterEventArgs e)
      {

      // set connectinon to ICurrencyOrder class above OrderA
      // this uses a switch statement (omitted) to use correct class (A, B, C etc).

      ICurrencyOrder ordVals = Class A;

      bool fill = false;

      for (int i=0; i<5 && fill=false; i++)
      {
           sendOrder("Symbol", price, clid, etc)

           Thread.Sleep(400);

           if (ordVals.Clid = clid)   // check to see if order was updated using client id
           {
                if (ordVals.Status = 'FILLED')
                {
                     filled = true;
                }

           }

      }    // end for loop

      }   // end EnterOrder

      private void UpdateOrdersListener(object sender, EventArgs e)
      {
          OrderUpdateEventArgs ev = (OrderUpdatEventArgs)e;

          // set connection to appropriate class using switch (symbol) omitted

          ICurrencyOrder ordVal = Class A;

          ordVal.Status = e.Status;

          ordVal.Clid = e.Clid;

      }  // end Class C

1 个答案:

答案 0 :(得分:0)

我认为AutoResetEvent是你正在寻找的课程,如果你想在继续做其他事情之前等待一些事情发生。

在课程说明页面上提供了一个示例,基本上您要在其中等待WaitOne,并在您想要继续时调用Set