public void head() ); } private void raiseevent(headedevent headedevent) ); }
所以我們只需在**裡raiseevent就可以了。
其實很簡單,因為我們要實現的是同步的事件,我們只需要找到所有處理這個事件的實現類,然後呼叫所有就可以了。
public inte***ce ieventhandlerwhere tevent : event
public class headedevent:event } public class guojizhangmothereventhandler : ieventhandler } public class pimingeventhandler:ieventhandler }
我們可以看到正真的事件協調者是eventbus, 之前的**如下是同步的。
public class eventbus
} }
為了提高效能,我們可以先來第一步改進
public void publish(t @event) where t : event
我們可以看到,現在並行處理可以大大加快速度,但是有兩個問題,第乙個問題就是沒有處理異常,所以讓我們加上異常。
public void publish(t @event) where t : event
private void handleevent(ieventhandlerhandle, t @event) where t : event catch (exception e) } }
第二個問題,就是我們雖然用了並行加快了速度,但是還沒有正真實現非同步,整個程式還是等所有handler處理完才返回。
public void publish(t @event) where t : event
這段**執行完,盡然發現handler沒有執行,好吧,原因是iqueryable的延遲執行,所以我們需要呼叫一下tolist
public void publish(t @event) where t : event
好了,我們就這樣輕易的實現了乙個asynceventbus, 是不是感謝.net的強大?
這裡還只是乙個系統內部的async, 如果涉及到系統之間的互動,這個就不行了,而且如果非同步處理有錯誤,我們就會有資訊丟失,所以需要更健壯的非同步事件處理系統,這個後面再講,但是一般的系統我們只需要把出錯的時間記錄下來,然後再看要不要處理就可以。
另外,非同步要處理的東西很多,比如處理完畢後,如何通知使用者,還是讓使用者重新整理? 我個人建議,一般情況下都不要用非同步,只有在真的需要的時候再用。
出處:
Python 事件驅動與非同步IO
一 事件驅動程式設計是一種程式設計正規化,這裡程式的執行流由外部事件來決定。它的特點是包含乙個事件迴圈,當外部事件發生時使用 機制來出發相應的處理。另外兩種常見的程式設計正規化是 單執行緒 同步以及多執行緒程式設計。1 讓我們用例子來比較和對比一下單執行緒 多執行緒以及事件驅動程式設計模型。下圖展示...
Springboot event 非同步事件
springboot 啟動非同步事件監聽機制 springboot事件監聽 spring中使用 async註解使even監聽事件之間的執行變為非同步 springboot之非同步事件 spring event的事件驅動模型的最佳實踐 eventlistener springboot實現觀察者模式 發...
Reactive框架 簡化非同步及事件驅動程式設計
net的reactive extensions包含一系列擴充套件方法和為.net 4及silverlight 4中新加入的 iobservable和 iobserver介面實現的linq標準順序運算子。加入到.net中的observable介面為基於推 push based 的通知提供了乙個公共介面...