计数没有的信号量实现。当前正在运行的实例

时间:2012-05-16 05:17:34

标签: c# semaphore

我正在研究多实例应用程序。在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。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

为什么不使用共享内存?当然,您必须使用所有进程可见的互斥锁来保护它,但这样您就可以在所有进程中存储常用数据。

我想你必须要P / Invoke平台例程才能创建一个共享内存,但它确实很简单。

答案 2 :(得分:1)

管理多个流程绝不是问题。操作系统在它们之间架起了一道巨大的墙,这使它几乎变得既硬又昂贵。您正在使用的代码也不例外,迭代运行的进程非常昂贵。始终首先考虑使用线程,然后在.NET程序中查找AppDomains,这是一个明确发明的功能,可以提供一个进程可以提供的隔离,但不会牺牲互操作屏障。

如果您致力于多进程解决方案,那么您几乎总是需要一个单独的进程充当仲裁器。负责确保工作流程开始并在其中一个人因未处理的异常而死亡时做一些有意义的事情。这本身就是很难处理的事情,因为没有好的方法可以获得有关它死亡的原因以及你失去了大量国家的任何信息。典型的结果是整个应用程序的故障,除非你给这些过程非常简单的事情,你可以很容易地做到这一点。

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