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

时间:2012-04-04 17:12:37

标签: c# winforms windows-services

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

5 个答案:

答案 0 :(得分:9)

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

与您的问题无关,但在同一个应用程序上创建的线程是另一回事。除非标有ThreadStatic属性

,否则它们将共享静态变量

答案 1 :(得分:2)

没有。除非您执行某些特定的操作,否则不会在不同进程之间共享此对象。

答案 2 :(得分:0)

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

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

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

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

它们完全是两回事。

答案 3 :(得分:0)

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

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

Java中,每个加载类的ClassLoader都有一个静态对象实例。我检查了C#中的等效功能。我发现this question on SO表明在C#中确实存在类似于多个类加载器的东西(我实际上在CLR中)并且我没有找到任何特定的多个实例的引用我肯定会是这样的。

答案 4 :(得分:0)

简单地说不,
static是'static per AppDomain'(并且每个进程可以有多个域),所以即使是一个进程也不能安全地假设您的静态变量将被“共享”(除非您手动创建新域,否则通常都是如此) ,例如见What is AppDomain?) - 例如网络应用程序通常打破“静态”单身人士等 换句话说,您需要使用某种持久性来在不同的应用程序之间共享数据。或者使用远程处理,WCF通过应用程序(域)边界进行通信。