计数编号的信号量实现.当前正在运行的实例数

本文关键字:运行 实例 实现 编号 信号量 | 更新日期: 2023-09-27 18:34:22

我正在研究多实例应用程序。C# 中有什么方法可以知道当前正在运行的实例数。
我使用一段代码来计算应用程序名称的窗口进程,但这不是一个好方法。

string fileName = Process.GetCurrentProcess().MainModule.FileName;
int count = 0;
foreach (Process p in Process.GetProcesses())
{
    try
     {
        if (p.MainModule.FileName == fileName)
        {
            count++;
        }
    }
    catch { }
}
MessageBox.Show("Total Instances Running are " + count);


是否可以通过使用信号量或一些增量和递

计数编号的信号量实现.当前正在运行的实例数

减计数器来完成,该计数器在创建新实例时递增 1,在实例关闭时递减 1。

Semaphore可以帮助您倒计时,当您达到 0 时会阻止您。您可以使用全局信号量,但您必须将其初始化为足够高的值并开始倒计时。

我认为总而言之,您自己的解决方案可能是最干净的。

为什么不使用共享内存?当然,您必须使用对所有进程可见的互斥锁来保护它,但是通过这种方式,您可以在所有进程之间存储常用数据。

我想你必须P/Invoke平台例程是为了创建一个共享内存,但它真的很简单。

管理多个进程从来都不是问题。 操作系统在它们之间竖起了一堵大墙,使它变得几乎任何困难和昂贵的东西。 您使用的代码也不例外,迭代运行的进程是昂贵的。 始终首先考虑改用线程,并在 .NET 程序中查找 AppDomain,这是专门发明的功能,旨在提供进程可以提供的隔离类型,但不会造成消除互操作屏障的成本。

如果您致力于多进程解决方案,那么您几乎总是需要一个单独的进程作为仲裁者。 负责确保工作进程启动,并在其中一个进程因未处理的异常而死亡时执行有意义的操作。 这本身就很难处理,因为没有好的方法可以获取有关它死亡原因的任何信息,并且您失去了大量的状态。 典型的结果是整个应用程序出现故障,除非您为这些过程提供非常简单的事情,而您可以轻松地这样做。

这样的仲裁进程在计算实例时没有问题,它可以使用 Process.Exited 事件来维护计数器。 一个事件,而不必轮询。