一个代表的多个事件

时间:2011-04-08 00:15:55

标签: c# .net events delegates

请注意;发布伪代码示例...请参阅下面的示例文本(我告诉过你这将是一个搞笑的混乱!)

Class Enter
{

  public event EnterDelegate EnterDelegateEvent;

  public event ExitDelegate ExitDelegateEvent;

  public Enter(EventEventArgs e)
  {
     // do something

     EnterOrder(e);

     ExitEventArgs ev = new ExitEventArgs(string ticker, double prices.. etc);
     ExitEvent(ev);

      // update order status etc.
  }

  private double EnterOrder()
  {
     double ent = 0.00
     if (EnterDelegateEvent != null)
     {
         ent = EnterDelegateEvent(this, e);
         return ent;
     }

     else { return e.lo;  }
  }

   public double ExitEvent(ExitEventArgs e)
   {
     // do something
     ExitEvent(ev);
   }

   private double ExitEvent()
   {
     double ext = 0.00
     if (ExitDelegateEvent != null)
     {
         ext = ExitDelegateEvent(this, e);
         return ext;
     }

     else { return e.Hi;  }
   }

}  // end Enter Class



Class EventHandlers
{
   public double SendEnter(EventArgs e)
   {
       // send enter to order server here
       return price;
   }
   public double SendExit(EventArgs e)
   {
       // send exit to order server here
       return price
   }

}


Orders Class
{

   Enter ent = new Enter();

   public GetOrders()
   {
      // get order data
      // create order event
      EnterEventArgs ev = new EnterEventArgs(ticker, price, data...etc);
      ent.Enter(ev);

    }
}

Orders.aspx.cs
{

    EventHandlers evt = new EventHandlers();
    Enter ent = new Enter();
    Orders ord = new Orders();

    Private void login()
    {
       // log into Orders Server
       ent.EnterDelegateEvent += EnterDelegate(evt.SendEnter);
       ent.ExitDelegateEvent += ExitDelegate(evt.SendExit);

    }

    private void logout()
    {
        // delete / remove delegate event handlers;
    }

    // initiate orders example event
    private void btnclick_GetOrders()
    {
       ord.GetOrders();
    }

}

除了运行上面的GetOrders之外,我还需要从GetBackTest()运行另一组订单。这有时需要同时执行,因此当它运行EnterOrder()例程时,EventDelegate需要返回if(EventDelegate) == null){return e.prices; }

而不是使用EventHandler方法......

Class Backtest
{
    Enter ent = new Enter();

   // kickoff enter order just as Orders Class does

    // this class needs to NOT use the Event Delegate as Orders class does

}

是否有一种简单的方法可以打开和关闭DelegateEvents并确保只实例化其中一个?如果我将Delegate事件转为Static,则backtest类将使用eventhandler方法。

3 个答案:

答案 0 :(得分:1)

我不确定我是否完全理解你所描述的场景,但事件和代表起初可能有点棘手。我建议阅读一些.NET事件教程:

答案 1 :(得分:1)

我建议先制定流程图。在我看来,你究竟想做什么并不清楚。也许使用流程图(或记录系统功能的其他方式)。

我甚至不确定你是否需要代表来解决这个问题。

答案 2 :(得分:0)

我真的不必使用事件委托,但是使用其他参数来路由需要添加它们并使用它们或使用现有的事件并造成破坏的事件,所以使用事件委托来路由交易事件,我刚刚补充:

 EventDelegateName += new DelegateName(eventhandler); // to top of orders.cs

 EventDelegateName -= new DelegateName(eventhandler); // to bottom of orders.cs

所以当backtest.cs运行时(Event == null)运行备用方法。