2008-11-12 118 views
16

我有一個程序集一次可以被多個進程使用。如果我使用靜態類,多個進程是否都使用該類的相同「實例」?靜態類的範圍是什麼?

由於進程是分開的,它們是否會在不同的應用程序域下運行,因此將靜態「實例」分開?

這裏的佈局中的布丁是由我設置爲並行批處理消息的自定義BizTalk適配器使用的程序集。這就是我上面所說的「多個進程」。

回答

10

多個線程將共享一個實例。因爲這個原因,靜態類可以方便地在線程之間傳遞狀態,但是你需要非常小心,不要引入競爭條件(Monitorlock你的屬性)。

但是,多個進程應該位於單獨的AppDomain中,因此每個都有自己的實例。

+0

網絡應用程序怎麼樣?如果我使用兩個OTHER獨立程序集(DLL#2和DLL#3)在DLL#1中定義的相同的靜態類,將#3定義爲網站應用程序,#2是網站引用的DLL,它們是否會共享相同的靜態類值? – 2014-07-10 23:01:45

13

靜態類每個應用程序域存在一次。在你的情況下,它將取決於適配器是在同一應用程序域中使用多個線程(從而共享一個靜態類的實例)還是使用多個進程(因此具有單獨的靜態類實例)。

+0

打敗我4秒 – 2008-11-12 16:31:57

2

靜態類的範圍僅限於應用程序域。每個應用程序域都有自己的可能的靜態變量副本。如果您的「進程」是同一應用程序域內的線程,那麼它們將共享靜態值。但是,如果它們是實際單獨的Windows進程,那麼它們將具有不同的應用程序域,因此具有不同的副本

6

「我有一個程序集一次可以被多個進程使用,如果我使用的是靜態類,多個進程是否都會使用該類的同一個」實例「?

不,它們都有不同的實例。

「由於進程是分開的,它們是否會在不同的應用程序域下運行,因此將靜態」實例「分開?

是的。

2

你可能想看看Singleton模式。要點似乎是你想控制服務實例的數量。

我猜你想要一個單獨的dll /項目服務於所有的客戶端請求。你可以使用static class/singleton/multiton來實現所需的功能。這真的取決於你想要完成什麼。