信号量和多个命令行进程
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()
,您想要消耗信号量而不是立即释放它
我有一个 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()