静态类的作用域是什么?

20

我有一个程序集,可能同时被多个进程使用。如果我使用静态类,那么这些多个进程是否都会使用同一个类的“实例”?

由于这些进程是分离的,它们运行在不同的应用程序域下,因此静态“实例”也是分开的吗?

需要注意的是,该程序集正在被自定义的BizTalk适配器使用,该适配器可以被设置为并行处理消息。这就是我上面所说的“多个进程”。

5个回答

13

静态类在每个应用程序域中只存在一次。 在您的情况下,这取决于适配器是否在同一个应用程序域中使用多个线程(从而共享静态类的单个实例)或使用多个进程(从而拥有静态类的分开实例)。


12

多个线程将共享一个实例。因此,静态类可以方便地在线程之间传递状态,但您需要非常小心,以避免引入竞态条件(Monitorlock属性)。

但是,多个进程应该位于单独的AppDomains中,因此每个进程都有自己的实例。


1
一个网页应用程序怎么样?如果我从两个其他独立的程序集(DLL #2和DLL #3)中使用在DLL#1中定义的同一个静态类,其中#3是一个网页应用程序,#2是被网站引用的DLL,它们会共享相同的静态类值吗? - Lord of Scripts
2
@LordofScripts 是的,因为它们都在同一个 AppDomain 中。 - Joel Coehoorn

6

我有一个程序集可能会被多个进程同时使用。如果我使用静态类,那么这些进程会同时使用同一个类的“实例”吗?

不会,它们都有独立的实例。

既然这些进程是独立的,那么它们是否在不同的应用程序域中运行,因此具有静态“实例”分开?

是的。


3

静态类的作用域仅限于应用程序域。每个应用程序域都将拥有自己的静态变量副本。如果您的“进程”是同一应用程序域内的线程,则它们将共享静态值。但如果它们是实际的不同Windows进程,则它们将具有不同的应用程序域,因此具有不同的副本。


2
您可能需要查看单例模式。其要点似乎是您想要控制服务实例的数量。
我猜您希望有一个单独的dll /项目来处理所有客户端请求。您可以使用静态类/单例/多例来实现所需的功能。这实际上取决于您想要实现什么。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接