我怎样才能拥有充当Machine Global Singleton的类?

时间:2012-12-17 18:20:57

标签: c# multithreading singleton mutex

我遇到服务在后台运行一组进程的情况。需要根据需要从GUI应用程序启动/停止这些进程。问题是正在运行的进程列表保存在用于监视和控制它们的对象的内存中。此对象位于服务实例上,因此无法从GUI应用程序实例访问。我认为我需要的是将该对象转换为机器上全局静态的Singleton,如Mutex,这样我就可以从GUI运行它的方法并让它们影响服务。示例代码如下,这不是我的代码,而是它的简化版本。我对基于Mutex的Singleton的解决方案感兴趣,或者更好地满足我的需求。

namespace SystemWideSingleton
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                Console.Write("Count = " + GlobalSingleton.Instance.Count++);
                Console.ReadLine();
            }
        }
    }

    public class GlobalSingleton
    {
        static GlobalSingleton() { }

        private GlobalSingleton()
        {
            Count = 0;
        }

        private static readonly GlobalSingleton _instance = new GlobalSingleton();
        public static GlobalSingleton Instance { get { return _instance; } }

        public int Count { get; set; }
    }
}

我希望上面的代码作为两个控制台应用程序运行,并为每个应用程序共享输出。离。

Application 1:  Application 2:
--------------  --------------
0               0
1               3
2               4
5               7
6               8

非常感谢任何帮助。

P.S。我知道现在所有我离开单例的是它将在同一个应用程序实例上的线程之间工作。我需要它在机器上的实例之间工作。

3 个答案:

答案 0 :(得分:0)

如果将这个好主意放在一边并专注于实际问题,您可以尝试使用Memory mapped filesmutex来预防竞争条件。

这有点麻烦,但可行。

答案 1 :(得分:0)

我认为你会发现没有"魔术.NET"解决这个问题。进程间通信需要根据您要完成的任务进行设计。

要访问在其他进程中运行的方法,您需要将这些方法公开给进程间通信通道。您可以使用多种方法来完成此任务,包括WCF,具体取决于您所需的复杂程度。

What is the easiest way to do inter process communication in C#?

编辑:如果您要完成的是(正如您所说的那样)只是为了弄清楚"正在运行的进程列表",System.Diagnostics.Process.GetProcesses()可能是最好的这样做的方式。您可以直接从系统获取进程句柄,这可能是您应该做的事情。作为替代方案,我不了解IPC或Mutexes或任何其他复杂内容的必要性。

答案 2 :(得分:0)

已向您建议了许多选项。我会选择其中之一。请记住,直接读取另一个进程的内存并不容易 - 它是OS和.NET CLR强制安全性。你必须遵守规则并正确行事。

执行此操作的最快方法可能是使用备份文件的global mutexthe best pattern to use it讨论),您可以在其中存储多个活动实例。可能有许多变化:您将此计数器存储在注册表,数据库,XML文件,文本文件中。

或者您可以在主(服务器)应用程序中存储计数器,并使用RPC / WCF / SOAP / REST等从从服务器(客户端)查询/更新它。