信号量和多个命令行进程

Semaphores and multiple command line processes

我有一个 C# 命令行 exe,我试图将其限制为最多出现 3 次。我正在使用信号量。代码如下。

private static void Main()
{
    using (Semaphore semaphore = new Semaphore(3, 3, "testing"))
    {
        if (!semaphore.WaitOne(100))
        {
            Console.WriteLine("Sorry too late");
            Environment.Exit(0);
        }

    } 
    Console.WriteLine("Hello world");
    Thread.Sleep(100000000);
}

我按了 CTRL-F5(运行 没有调试)三次,然后我的进程启动并进入休眠状态。然后我开始第四次出现,它 运行 没有问题。

我做错了什么?

Semaphore 对象是特殊的,因为您可以给它们 "system names",就像您所做的那样,使它们跨进程同步。

这意味着我最初认为每个进程都会创建自己的版本是不正确的,这导致了你的问题。

但是,您在 using 块中使用它,因此在它完成工作后,它会处理掉它。下一个过程会生成一个新过程,依此类推。有关如何正确执行此操作的工作示例,请参阅 MSDN

删除 using 块,或者,不要为此使用 Semaphore,只需执行:

if (Process.GetProcessByName(Process.GetCurrentProcess().ProcessName).Length < 4)
  //You are ok!

检查进程的 运行 个实例数。

除了 Bradley 的精彩回答之外,我想知道您的代码是否应该改为:

private static void Main()
{
    using (Semaphore semaphore = new Semaphore(3, 3, "testing"))
    {
        if (!semaphore.WaitOne(100))
        {
            Console.WriteLine("Sorry too late");
            Environment.Exit(0);
        }

        Console.WriteLine("Hello world");
        Thread.Sleep(100000000);
    } 

}

...因为虽然程序本质上是 运行,但由于 Dispose()

,您想要消耗信号量而不是立即释放它