簡體   English   中英

提出活動的假設

[英]Assumptions on event raising

想象一下以下課程:

class A
{
     public event EventHandler AnyEvent;
}

您創建類A的實例,並附加一些事件處理程序。 現在,如果AnyEvent ,則我不認為事件處理程序將在我創建對象的線程之外的另一個線程上執行。 如果您在GUI線程上創建了對象,並且事件處理程序對GUI元素執行了操作,那么這將是最重要的。 這將迫使我使用適當的調用模式。

如果使用定義事件的接口,這真的變得邪惡:

interface B
{
     event EventHandler SomeEvent;
}

現在,一個實現可以從原始線程引發事件,而另一個從另一個線程引發事件。 這可能會導致您的應用程序成功使用一個應用程序,而無法使用另一個實現。

我認為編碼應該始終透明-這不是! 而且,如果我不創建另一個線程,則不會假設我的方法是從本地線程以外的任何其他線程執行的。

有沒有我沒有考慮的方面? 有什么會使我的假設無效嗎?

事件沒有魔術。 事件在引發事件的線程上處理。 它與創建對象的線程無關。

線程是類的使用者的責任,而不是類的編寫者的責任,因此您的假設是錯誤的。

一個人應該假設一個類不是線程安全的,除非它被證明是線程安全的。 甚至大多數內置的.NET類都不是線程安全的,除非他們說是安全的。

由類的使用者來了解線程。

調用事件只是使用諸如函數指針之類的機制來調用某些方法(或方法集合)。

事件完全忽略了附加事件的線程,並且沒有任何其他信息可以導致在正確的線程上正確調用方法。

也許您是從COM時代得出的假設?

事件的處理程序回調在引發事件的同一線程上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM