【问题标题】:What is the scope of a Static Class?静态类的范围是什么?
【发布时间】:2010-09-22 00:28:32
【问题描述】:

我有一个程序集,一次可以由多个进程使用。如果我使用的是静态类,多个进程是否都使用该类的相同“实例”?

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

这里的详细信息是该程序集由一个自定义 BizTalk 适配器使用,我将其设置为并行批处理消息。这就是我上面所说的“多进程”。

【问题讨论】:

    标签: c# static biztalk applicationdomain


    【解决方案1】:

    每个应用程序域存在一次静态类。在您的情况下,这取决于适配器是在同一应用程序域中使用多个线程(因此共享静态类的单个实例)还是使用多个进程(因此具有静态类的单独实例)。

    【讨论】:

      【解决方案2】:

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

      但是,多个进程应该位于不同的 AppDomain 中,因此每个都有自己的实例。

      【讨论】:

      • Web 应用程序怎么样。如果我使用来自两个其他单独程序集(DLL #2 和 DLL #3)的 DLL #1 中定义的相同静态类,即 #3 是网站应用程序,而 #2 是网站引用的 DLL,它们是否会共享相同的静态类价值观?
      • @LordofScripts 是的,因为它们都在同一个 AppDomain 中
      【解决方案3】:

      静态类的范围仅限于应用程序域。每个应用程序域都将拥有自己可能拥有的任何静态变量的副本。如果您的“进程”是同一应用程序域中的线程,那么它们将共享静态值。但是,如果它们是实际独立的 Windows 进程,那么它们将具有不同的应用程序域,因此会有不同的副本。

      【讨论】:

        【解决方案4】:

        “我有一个程序集可能一次被多个进程使用。如果我使用的是静态类,多个进程是否都使用该类的相同“实例”?” em>

        不,它们都有单独的实例。

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

        是的。

        【讨论】:

          【解决方案5】:

          您可能想查看单例模式。要点似乎是您要控制服务实例的数量。

          我猜您需要一个单独的 dll/项目来服务所有客户端请求。您可以使用静态类/单例/多例来实现所需的功能。这实际上取决于您要完成的工作。

          【讨论】:

            猜你喜欢
            • 2012-05-29
            • 2017-02-09
            • 2011-05-20
            • 2023-03-18
            • 1970-01-01
            • 2010-10-16
            • 2016-01-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多