信号量和多个命令行进程

时间:2015-01-23 17:46:51

标签: c# multiprocessing semaphore

我有一个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(没有调试运行)三次,我的进程启动并全部休眠。然后我开始第四次出现并且没有问题。

我做错了什么?

2 个答案:

答案 0 :(得分:2)

Semaphore个对象是特殊的,因为你可以像他们一样给它们"系统名称"以使它们跨进程同步。

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

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

删除使用区块,或者不要使用Semaphore,只需执行以下操作:

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

检查流程的运行实例数。

答案 1 :(得分:1)

除了布拉德利的好答案之外,我想知道你的代码应该改为:

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()

,您希望使用信号量而不是立即释放它