2010-11-05 60 views
2

我已經讀了有關應用程序域和線程了一下,我碰到這個聲明是:線程穿越應用程序域的簡單示例?

「特定線程並不侷限於一個應用程序域也就是說,線程可以自由地跨應用程序域邊界;不爲每個應用程序域創建新的線程。「

現在,這一切都很好,但我想到了自己 - 什麼時候線程正在發生交叉?

我見過創建應用程序域並使用CreateInstanceAndUnwrap和MarshalByRefObject的人的示例。但是 - 編組可以在完全獨立的進程之間使用!所以呢 - 這不是我所說的「自由穿越」。

任何人都可以提供一個線程穿越應用程序域的示例(C#)代碼而不用編組,因爲我不認爲這是「免費的」? (或者我像往常一樣完全混淆)。

回答

0

我不相信用戶線程可以跨多個應用程序域。但是,CLR工作線程,GC線程等可以做到。

0

一個示例可能是調用本地代碼,本地代碼在另一個appdomain中調用回調。

進程內的編組可能會使用優化的路由,其中​​多個AppDomain中使用相同的OS線程。

1

嗯,很簡單,CreateInstanceAndUnwrap()使線程穿越AppDomain屏障。畢竟,創建的對象存在於AD中,線程必須進行轉換才能調用構造函數。當您通過代理調用類方法進行調用時,會發生額外的交叉。

和AppDomain是而不是代碼的障礙,它隔離數據。每個AD都有自己的GC和加載程序堆。序列化是跨越數據障礙所必需的。但它是完全相同的線程來重新反序列化並繼續執行。這與進程之間的編組完全不同,在兩個不同的線程之間發生。在不同的虛擬內存視圖和所需的線程上下文切換之間進行封送處理相當大的開銷。一個AD是一個很多一個更便宜的過程版本。