[英]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.