6

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

4

5 回答 5

10

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

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

于 2012-04-04T17:14:58.010 回答
2

不。除非你做一些特定的事情来实现这个对象在不同的​​进程之间是不共享的。

于 2012-04-04T17:15:45.260 回答
0

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

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

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

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

它们是完全不同的两种东西。

于 2012-04-04T17:14:23.080 回答
0

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

复杂的部分是单个进程中甚至可能有多个静态实例。

每个加载类Java的静态对象都有一个实例。ClassLoader我检查了C#. 我在 SO 上发现了这个问题,C#这表明在(我猜实际上在)中确实存在类似于多个类加载器的东西CLR,虽然我没有找到对静态多个实例的任何具体引用,但我确信情况会如此。

于 2012-04-04T17:41:42.787 回答
0

简单地说不,
静态是“ static per AppDomain”(每个进程可以有多个域),因此即使一个进程也不能安全地假设您的静态变量将是“共享的”(通常是真的,除非您手动创建新域,例如,请参阅什么是 AppDomain?) - 例如,网络应用程序通常会破坏“静态”单例等
。换句话说,您需要使用某种持久性才能在不同的应用程序之间共享您的数据。或者使用远程处理、WCF 通过应用程序(域)边界进行通信。

于 2012-04-04T20:06:57.910 回答