[.NET Concept]盡量避免在另一個執行緒觸發事件或委派


記得在之前工作時跟其它部門的同仁做過一次程式的整合,所提供的組件需要指定一個委派,當組件有資料需要處理時會透過指定的委派告知,整合完後拿去給界面使用,卻意外的被處理界面的同事告知出現了跨執行緒作業無效的問題。原來在該組件中有開另一個執行緒去接收資料,收到資料後直接透過委派告知,我程式中委派的動作跟著被帶到另一個執行緒,間接產生了這個不被我注意到的問題。





個人以為程式開發人員應盡量避免在另一個執行緒觸發事件或委派,如此調用人員能清楚的知道事件或委派所運行的執行緒,試想若所有的事件或委派都有可能在任何執行緒觸發,對調用者來說有多麼可怕,調用者並不知道處理動作被帶離了本來運行的執行緒,不僅要花時間確定觸發的執行緒,若要控制界面還需帶回主執行緒,等於是把一部分的底層工作丟給界面去做,讓界面在開發上變得不好處理。而若事件與委派的觸發都能在原調用的執行緒,將能減少因調用者的誤判造成程式發生不如預期的錯誤。因此若應效能上的考量需要另開執行緒處理,應盡可能將事件與委派帶回原執行緒觸發。





再來讓我們看看.NET Framework BCL,在使用.NET Framework BCL時若MSDN中並未提及其所在的執行緒,您是否都將其視為在主執行緒觸發呢?而會在另一個執行緒觸發的事件是否佔據少數,且多半是由非同步處理有關的動作所觸發?