5

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


是否可以通过使用信号量或一些增量和减量计数器来完成,该计数器在创建新实例时加一,在实例关闭时减一。

4

3 回答 3

1

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

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

于 2012-05-16T05:21:09.257 回答
1

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

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

于 2012-05-16T12:13:26.070 回答
1

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

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

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

于 2012-05-16T13:07:38.810 回答