繁体   English   中英

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

[英]C# .net event handler delegate question

类A包含变量A,以保存在类C(doEvent())中触发的事件的状态。 线程在等待类B启动事件时睡眠500 ms,该事件将EventArg数据发送回类C并调用事件处理程序UpdateClassVar(EventArgs e)-这就是它所等待的。

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

免责声明:考虑我是一个新手程序员。 考虑一下这是我的最佳尝试,这是一个相当优雅的解决方案。 请随时重新设计和重新编码,这应该被认为是解决上述问题的一种原型。

注意:代码示例针对“真实世界”示例进行了编辑,该示例应该可以正常工作。 (未完全测试)

附加问题-以下示例中的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

我认为,如果要在继续执行其他操作之前先等待某些事件发生,则您正在寻找AutoResetEvent

在类描述页面上提供了一个示例,基本上是在要等待的地方调用WaitOne ,并在要继续时Set

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM