使用Semaphore在C#中创建单实例应用程序

时间:2015-04-28 15:06:59

标签: c#

我不确定为什么下面的代码不能在我的工作机器(Win7)上强制执行单个实例应用程序,但它在我家的个人计算机(Win8)上运行正常(例如,只有一个应用程序实例可以一次运行)。据我所知,每个具有相同名称的内核句柄对象只能创建一次。但我可以在我的工作机器上运行多个应用程序实例......

static void Main(string[] args)
{
    bool createNew;
    const string appName = "TestMyApplication";
    using (new Semaphore(0, 1, appName, out createNew))
    {
        if (createNew)
        {
            Console.WriteLine("One instance of MyApplication is created and running...");
        }
        else
        {
            Console.WriteLine("Only one instance of MyApplication can be running at a time... Auto shut down in 3 seconds...");
            Thread.Sleep(3000);
        }
    }
   Console.ReadKey();
}

1 个答案:

答案 0 :(得分:2)

您的Console.ReadKey()超出了信号量的范围。在您的下一个应用程序运行之前,您的锁定会立即被销毁,因此它们似乎都在运行。

以下是可以保持第一个实例处于活动状态并且仍然通过实际关闭锁定另一个实例的更改。

using (new Semaphore(0, 1, appName, out createNew))
{
    if (createNew)
    {
        Console.WriteLine("One instance of MyApplication is created and running...");
        Console.ReadKey();
    }
    else
    {
        Console.WriteLine("Only one instance of MyApplication can be running at a time... Auto shut down in 3 seconds...");
        Thread.Sleep(3000);
        return;
    }
}