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