Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.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# .NET-限制执行单元的实例数_C#_.net_Executable_Multiton_Application Singleton - Fatal编程技术网

C# .NET-限制执行单元的实例数

C# .NET-限制执行单元的实例数,c#,.net,executable,multiton,application-singleton,C#,.net,Executable,Multiton,Application Singleton,比方说,我有一个用C#编写的应用程序,名为EquipCtrl.exe,它作为PC上的本地进程运行,以控制一台设备 显然,我希望在每台电脑上只运行一个Equipctrl实例。如果我在每台电脑上有两个equip来控制,那么我会将它限制为每台电脑两个实例 我的做法是 1.进程名称。我将流程命名为EqCtrl,在流程启动时,它将统计名称为“EqCtrl”的流程数。 2.执行名称。启动时,计算执行名为EquipCtrl.exe的进程数。 3.注册表记录。 4.SQL Server数据库记录 对我来说,进程

比方说,我有一个用C#编写的应用程序,名为EquipCtrl.exe,它作为PC上的本地进程运行,以控制一台设备

显然,我希望在每台电脑上只运行一个Equipctrl实例。如果我在每台电脑上有两个equip来控制,那么我会将它限制为每台电脑两个实例

我的做法是 1.进程名称。我将流程命名为EqCtrl,在流程启动时,它将统计名称为“EqCtrl”的流程数。 2.执行名称。启动时,计算执行名为EquipCtrl.exe的进程数。 3.注册表记录。 4.SQL Server数据库记录

对我来说,进程名或执行名检测是最简单的,也是我经常做的事情(如果不是全部的话)。但是,它们很容易受到名称冲突的影响。即使我进一步查找执行路径,也可以通过将执行文件复制到另一个文件夹来规避限制


在.NET上执行执行限制的最佳方法是什么?为什么?注册表记录是最好的方法吗?

尝试系统范围的信号量:
嗯。。当我们希望只允许应用程序的单个实例时,我们使用

这并不能完全实现您想要的场景


另一点,为了避免冲突,除了可执行文件名和目录外,还可以使用可执行文件的MD5哈希。

斯科特·汉斯曼的博客中有一篇关于此的文章


您可以使用计数命名互斥体\信号量来完成此操作,同时确保您创建的互斥体/信号量前缀以全局\和本地\开头,否则远程桌面连接将不会读取这些命名互斥体,并且计数将丢失


+1(如果我能投票的话)。我在C应用程序中使用过这个,它在C#中应该工作得很好。您需要做一些工作,比如检查另一个进程是否已经创建了信号量。如果没有,则尝试创建它。如果它已经存在,您需要查看是否可以锁定它。锁需要尝试用超时来锁定信号量。如果超时,那么您的进程是一个额外的进程,应该退出。要做到这一点需要做一些工作,但这是问题的正确答案。使用命名信号量,所有进程实例使用相同的名称。本文似乎没有解决偶尔需要在一台PC上允许多个程序实例的问题。这取决于您如何处理OnStartupNextInstance;我发现有趣和有趣的是,C开发人员从来没有考虑使用MyStudio.VisualBasic汇编中可用的工具,因为它是“坏的”;然而,其中有一些有用的工具可以节省开发工作。