我有以下代码,我处理一个事件两次。但是,我始终希望确保mynewclass
始终首先处理事件,然后触发本地事件处理程序代码。我理解MyClass事件应首先触发,因为它是首先创建的事件,但因为线程和入队正在发生,我认为它需要花费太长时间并且在我希望它之前在myhandleeventlocal
中执行某些操作。我能以任何方式等待它发生吗?
public MyMainClass
{
private MyMethod()
{
MyClass mynewclass = new MyClass();
mynewclass.myObject += MyHandler(myhandleventlocal);
mynewclass.loadedevent += EventHandler(loadedevent)
}
private void myhandleventlocal()
{
//do stuff
}
private void loadedevent()
{
//do some stuff
}
}
public MyClass
{
public MyObject myObject;
public event loadedevent;
public MyClass()
{
myObject = new MyObject();
myObject += MyHandler(myhandlevent);
}
private void myhandlevent(long value, string detail)
{
//Start a thread
//Enqueue value and detail
//On seperate thread dequeue value and process it
//Raise loadedevent event
}
}
更新:我已更新我的问题和代码以证明问题。
答案 0 :(得分:6)
通过 default 按照添加顺序调用事件处理程序,因此如果您始终按照希望它们触发的顺序添加处理程序,那么它应该可以正常工作。
来自Jon Skeet关于events and delegates的文章:
[...]额外的代表被添加到列表的末尾[...]
注意:您可以通过更改事件的add
和remove
操作来覆盖事件的默认行为,以指定其他一些行为。然后,您可以将事件处理程序保存在您自己管理的列表中,并根据您喜欢的规则处理触发顺序。
答案 1 :(得分:3)
如果您无法保证将添加事件处理程序的顺序,只需添加mynewclass
的一个,然后在该代码中调用其他代码。
答案 2 :(得分:2)
由于事件处理程序是按照您添加它们的顺序调用的,因此根据我在您的问题中看到的代码,您不能首先调用mynewclass的处理程序。 MyClass创建的事件处理程序始终首先添加。
一种解决方案是控制事件处理程序的优先级。您可以使用添加和删除事件的方法来代替使用内置事件处理程序+ = / - =运算符,您可以在其中明确指定排序。这样,如果一个类知道它需要首先处理事件,它可以要求这样做。但要小心,因为你可能很容易遇到多个类都坚持他们首先处理事件的情况。
以下是一些快速而又脏的代码,可帮助您入门:
class MyClass {
private LinkedList<MyEventHandler> eventHandlers;
public enum Ordering { First, Last, ... };
public void AddHandler(MyEventHandler handler, Ordering order) {
switch(order) {
case Ordering.First:
eventHandlers.AddFirst(handler);
break;
// fill in other cases here...
}
}
public void RaiseEvent() {
// call handlers in order
foreach(MyEventHandler handler in eventHandlers)
eventHandler();
}
}
答案 3 :(得分:0)
参考siride解决方案,您还可以实现处理程序并确定这种位置。就像反转顺序(总是在开头添加)或添加一些逻辑。