2009-09-29 38 views
0

何時適合在C#中引發事件?何時使用自定義c#事件

作爲一個例子,在我們的系統中,我們有數據對象從外部系統發送給我們,比如每分鐘50次。在收到數據包後,我們需要讓它由另一個對象處理。在這種情況下使用事件或簡單的方法調用會更好嗎?

一個事件看起來很直觀,但我不清楚它與單純使用常規方法調用相比有什麼優點。

回答

4

當不適合源自動作的代碼直接瞭解對該動作作出反應的代碼時,應該使用事件。

一方面,這裏的事件聽起來很合適,因爲處理數據接收的代碼不應該依賴於執行與所述數據有關的代碼的實現。否則,數據接收代碼現在負責兩件事 - 接收數據委託其處理。另一方面,如果數據的特定處理與外部調用者發送的行爲直接相關,則將其作爲函數調用可能更有意義。我們的問題中沒有足夠的信息可以肯定地說出來。

0

在這種情況下,事件沒有意義。事件傾向於告知正在發生的事情,而不是取代函數調用。它們更具信息性。

因此,您可能需要傳遞一個Action函數,以便您可以調用傳入的函數來執行處理。

這會比函數調用IMO更好。

你可以看一下這個頁面的例子: http://www.claassen.net/geek/blog/2007/12/action-func-never-write-another.html

更新:如果你不使用C#3,那麼你可能需要使用一個委託來代替,其中,事件處理程序是一個專門的委託。

+1

我不同意「不要替換函數調用」語句。事件處理程序是函數調用。事件旨在用於在代碼(函數)以解耦方式滿足條件時有機會執行。想想控制;當用戶做某事時,他們給命令式代碼(函數)提供運行的機會。另外需要注意的是事件處理程序是ARE委託,因此傳遞一個Action並傳遞一個EventHandler是一回事;他們只是有不同的簽名。話雖如此,我是Action委託類的大用戶 – 2009-09-29 00:41:15

+0

從模式角度來看,您所描述的內容幾乎與事件相同,除了只需要一個用戶。 – 2009-09-29 00:57:42

+0

我傾向於只是傳遞Action <>函數,因爲它擺脫了需要委託,它簡化了我的代碼,我相信它使它更加靈活。 – 2009-09-29 02:00:32

1

IMO使用隊列將是一個合適的第一步。處理Queue的代碼反過來可以引發事件或接受一個根據數據對象類型執行不同任務的委託。 Action或Func應該在這裏運行得很好。

請記住,當您使用事件時,您必須確保處理程序及時取消註冊,否則您可能會泄漏。