【发布时间】:2019-11-27 18:54:24
【问题描述】:
如果 exe 已经在运行,我目前正在使用以下函数来停止我的 exe
public static bool IsAlreadyRunning()
{
string strLoc = Assembly.GetExecutingAssembly().Location;
FileSystemInfo fileInfo = new FileInfo(strLoc);
string sExeName = fileInfo.Name;
bool bCreatedNew;
Mutex mutex = new Mutex(true, "Global\\" + sExeName, out bCreatedNew);
if (bCreatedNew)
mutex.ReleaseMutex();
return !bCreatedNew;
}
但是我的 exe 可以使用不同的参数运行,所以只有当我的 exe 的另一个实例使用相同的参数运行时,我才需要停止该 exe。
那么有没有办法从上面的代码中获取参数或任何指针来完成这项工作?
【问题讨论】:
-
仅当您使用参数生成互斥锁名称时。互斥锁只需要每个实例有一个唯一的名称。它不必包含可执行文件名称或参数本身,它可以是由它们生成的哈希。
-
参数传递给
Main方法,你可以检查一下 -
好的干净的方法是将参数传递给方法。 quick&dirty 方法是使用 `Environment.CommandLine 获取整个命令行或使用 GetCommandLineArgs 获取参数
-
只是一个建议,您可以将进程状态信息存储在二进制文件中。每当用户尝试运行新的 exe 时,您可以先检查此文件。如果有冲突,你可以通过它的 id 杀死前一个进程(它也可以存储在文档中),然后你可以运行新的。它不会阻止用户使用相同的参数运行相同的 exe,因为程序应该首先启动以检查文件,但至少您可以使用这种方法阻止其余进程。
-
@ycansener 这就是互斥锁的意义所在。即使进程崩溃,也必须删除锁定文件(您的建议)