是一个静态对象,在多个正在运行的应用程序中是同一个对象

本文关键字:运行 一个对象 应用程序 一个 对象 静态 | 更新日期: 2023-09-27 18:30:13

如果您有一个windows服务和一个使用相同静态对象的windows窗体应用程序,那么这两个应用程序中的对象是否相同?换句话说,如果我在服务中更新对象,如果两者同时运行,它是否也会在表单应用程序中更新?

是一个静态对象,在多个正在运行的应用程序中是同一个对象

它们在不同的进程上运行,因此不共享静态对象。

与您的问题无关,但在同一应用程序上创建的线程是另一回事。它们将共享静态变量,除非标记有ThreadStatic属性

否。除非你做了一些特定的事情来实现这一点,否则不同的进程之间不会共享对象。

这个问题的简单答案是每个进程都有自己的静态,所以不,它不会在服务和桌面进程之间共享。

复杂的部分是,在单个过程中甚至可能存在静态的多个实例

Java中,每个加载类的ClassLoader都有一个静态对象实例。我检查了C#中的等效功能。我在SO上发现了这个问题,这表明在C#中确实存在类似于多个类加载器的东西(我想实际上是在CLR中),尽管我没有发现任何对静态的多个实例的具体引用,但我相信会是这样。

简单地说不,
static是"static per AppDomain"(每个进程可以有多个域),因此即使对于一个进程,也不能安全地假设您的静态变量将被"共享"(通常情况下是正确的,除非您手动创建新域,例如,请参阅What is AppDomain?)-例如,web应用程序通常会打破"静态"单一项等。
换句话说,您需要使用某种持久性,以便能够在不同的应用程序之间共享数据。或者使用远程处理、WCF通过应用程序(域)边界进行通信。

我认为每个应用程序都在自己的进程中运行。我真的怀疑在Windows服务中更新静态对象是否会对作为Windows窗体应用程序运行的静态对象产生任何影响。

Windows服务在system帐户下运行,其中Windows窗体应用程序在User帐户下运行。

正如其他人在评论中指出的那样,进程在不同的内存中运行。每个流程都有它自己的地址空间。

Windows服务响应服务控制管理器命令。

它们完全是两回事。