有没有办法指定处理注册事件代表的顺序或优先级?例如,我有一个事件需要在任何其他事件之前立即处理,但我希望其他对象也可以注册事件的侦听器。这如何实现?事件优先级和流程订单
可以说,我想PROC1总是PROC之前这样做的运行2.
class MessageProcessor
{
private DataClient Client;
public MessageProcesser(DataClient dc)
{
Client = dc;
Client.MessageReceived += ProcessMessage;
}
void proc1(MessageEventArgs e)
{
// Process Message
}
}
class DataClient
{
public event MessageReceievedHandler MessageReceived;
}
void main()
{
DataClient dc = new DataClient();
MessageProcessor syncProcessor = new MessageProcessor(dc); // This one is high priority and needs to process all sync immediately when they arrive before any data messages
MessageProcessor dataProcessor= new MessageProcessor(dc); // This one can process the data as it has time when sync messages are not being processed.
// do other stuff
}
的原因,我有一个是通过UDP流发送邮件的服务器。它会在突发数据前发送同步消息。我意识到这两个处理程序会在收到同步消息时触发,但为了减少延迟,我希望在dataProcessor事件之前处理syncProcessor对象事件。这将减少正在处理的同步消息的延迟。
另外,我的团队中的其他人也可能想要注册事件来处理特定的消息。他们可能有自己的对象来注册一个事件(可能不是MessageProcessor),即使同步消息应该尽可能的延迟。
编辑用更好的例子使目标更清晰。
在处理程序中排队MessageEventArgs,然后启动一个实现优先级和依赖性的方法。这是你知道的一个bugfest,在我试图不经常失败之前,我会与自己进行激烈的对话。 – 2012-03-08 18:34:27
我只是为了简单起见,因为我认识到在这种情况下注册同一资源/对象内的两个事件都是毫无意义的。我会更改我的设置以更准确地表示我的目标。 – galford13x 2012-03-08 18:34:58
@Tony:有趣的想法。我同意这可能会进入一个问题领域。我实际上正在考虑创建一个接口,当有人注册一个事件时,DataClient会注册它,但有一个优先级映射对象,当收到一条消息时它会按照定义的顺序关闭处理程序中的事件。但这似乎也是一个不好的道路。 – galford13x 2012-03-08 18:37:46