有沒有辦法指定處理註冊事件代表的順序或優先級?例如,我有一個事件需要在任何其他事件之前立即處理,但我希望其他對象也可以註冊事件的偵聽器。這如何實現?事件優先級和流程訂單
可以說,我想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