基于输入参数阻止同一应用程序同时运行

时间:2018-12-19 17:22:04

标签: c# mutex

我想防止实例针对从命令行输入的特定参数运行。如果它们都采用不同的参数,我想允许多个实例运行。这是我的代码片段,试图实现这一点:

private static readonly Mutex SingletonA = new Mutex(true, "A");
private static readonly Mutex SingletonB = new Mutex(true, "B");

var arguments = Environment.GetCommandLineArgs();

if(arguments[1]=="A" && !SingletonA.WaitOne(TimeSpan.Zero, true)) return; //end the process
if(arguments[1]=="B" && !SingletonB.WaitOne(TimeSpan.Zero, true)) return; //end the process

但是我发现,如果有正在运行的实例,则SingletonA和SingletonB都将为false。

有没有办法实现它?

2 个答案:

答案 0 :(得分:-1)

请考虑以下答案仅说明了这一点,并且不包含准备使用的代码:

private static Mutex Singleton = null;
...
var arguments = Environment.GetCommandLineArgs();
var mutexName = arguments[1];

Singleton = new Mutex(false, mutexName);

if(!Singleton.WaitOne(TimeSpan.Zero, true)) return; //end the process

private static Mutex Singleton = null;
...
var arguments = Environment.GetCommandLineArgs();
var mutexName = arguments[1];
var isCreated = false;

Singleton = new Mutex(true, mutexName, isCreated);

if (!isCreated)
  Environment.Exit(1); //end the process  

答案 1 :(得分:-1)

针对该构造函数的Microsoft Documentation(强调我的意思):

  

如果name不为null且initialOwned为true,则仅当此调用创建了指定的系统互斥锁时,调用线程才拥有该互斥锁。 由于没有机制可以确定是否创建了命名系统互斥体,因此在调用此构造方法重载时,最好为initialOwned指定false。如果可以使用Mutex(Boolean,String,Boolean)构造方法您需要确定初始所有权。

将调用更改为所有权参数传递为false,就应该全部准备就绪。

private static readonly Mutex SingletonA = new Mutex(
    false, 
    "A");
private static readonly Mutex SingletonB = new Mutex(
    false,
    "B");

(尽管此示例可能对其他人没有多大用处,因为第一个进程会立即同时获取Mutex单例,并且关于保存它们多长时间,原因,进程何时或如何退出并没有上下文。)