Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我怎样才能拥有一个充当机器全局单例的类?_C#_Multithreading_Singleton_Mutex - Fatal编程技术网

C# 我怎样才能拥有一个充当机器全局单例的类?

C# 我怎样才能拥有一个充当机器全局单例的类?,c#,multithreading,singleton,mutex,C#,Multithreading,Singleton,Mutex,我遇到的情况是,一个服务在后台运行一组进程。这些过程需要根据需要从GUI应用程序启动/停止。问题在于,正在运行的进程列表保存在内存中的一个对象上,该对象旨在监视和控制这些进程。此对象位于服务实例上,因此无法从GUI应用程序实例访问。我认为我需要的是将该对象转换成一个在机器上全局静态的单例,比如互斥体,这样我就可以从GUI运行它的方法,并让它们影响服务。下面是示例代码,这不是我的代码,而是它的一个简化版本。我对基于互斥的单例的解决方案感兴趣,或者更适合我需要的替代方案 namespace Syst

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

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
任何帮助都将不胜感激


另外,我知道现在我从singleton得到的只是它将在同一个应用程序实例上的线程之间工作。我需要它在机器上跨实例工作。

将这是否是一个好主意放在一边,集中精力解决实际问题,您可以尝试与
互斥锁一起使用,以防止出现争用情况


这有点麻烦,但可行。

我想你会发现,这个问题没有“magic.NET”解决方案。进程间通信需要根据您试图实现的目标进行设计

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


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

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

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


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

否。它不是这样工作的。您需要在进程之间进行一些通信。单身人士也不好。GlobalSingleton类似于devil的同义词。也许您可以使用内置的dispatcher从UI线程上的不同线程发出调用,并让dispatcher为您排队调用和处理并发。不使用Process.GetProcesses()而过滤你的进程就可以做到这一点吗?单例经常使用得很糟糕,我意识到它们应该少用。我看过,也希望能找到一段视频,其中有人,我想是Jon Skeet,创建了一个应用程序,并使用线程让它与另一个实例共享信息。这就是我想要的。是的,在你告诉我我做错了之前,我还是在寻找一种方法来控制windows服务内存中的对象。我不想设置一个WCF层来这样做,但如果结果证明我必须这样做,那么我有一个想法,即使你让它工作,它将无法维护之前,你在第二天。向服务添加命令,然后让GUI使用它们。想一想,如果你想让多台机器运行你的东西,你必须要做什么……虽然我的问题可能没有传达这一点,但我的总体目标是让这一点尽可能简单。这就是为什么我不希望将WCF层拖到这里,但看起来这可能是最佳解决方案。实际上,我希望访问在不同进程中运行的类中的某些方法。是的,这仍然是进程间通信。你能更好地解释一下你的要求吗?也许重新考虑应用程序的设计是可能的?