1

我有一个服务在后台运行一组进程的情况。这些进程需要根据需要从 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

任何帮助将不胜感激。

PS我知道现在我从单例中得到的只是它可以在同一个应用程序实例上的线程之间工作。我需要它跨机器上的实例工作。

4

3 回答 3

0

我想你会发现这个问题没有“神奇的.NET”解决方案。进程间通信是需要根据您要完成的任务来设计的。

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

在 C# 中进行进程间通信的最简单方法是什么?

编辑:如果您想要完成的是(如您所说)只是为了找出“正在运行的进程列表”, System.Diagnostics.Process.GetProcesses() 可能是最好的方法。您可以直接从系统获取进程句柄,这可能是您无论如何都应该做的。我不明白需要 IPC 或 Mutexes 或任何其他复杂的东西作为替代品。

于 2012-12-17T19:06:00.543 回答
0

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

也许最快的方法是使用一个全局互斥锁(讨论使用它的最佳模式)备份一个文件,您可以在其中存储许多活动实例。可以有很多变体:您将此计数器存储在注册表、数据库、XML 文件、文本文件中。

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

于 2012-12-17T20:44:12.403 回答
0

抛开这是否是一个好主意并专注于实际问题,您可以尝试使用Memory mapped files以及 amutex来防止竞争条件。

这会有些麻烦,但可行。

于 2012-12-17T18:43:55.093 回答