1

我想确保在我的项目中相互排斥以安装更新。
该项目是多实例的,这意味着一个人可以打开一个实例而无需关闭其他打开的实例。有一个称为installUpdates()安装可用更新的函数。由于存在多个实例,因此只有其中一个需要安装更新。我想确保只有一个实例会安装更新。
我正在将一个名为noOfInstances(信号量)的全局变量初始化为0. 一旦打开一个新实例,变量将增加 1。如果有 4 个打开的实例,则值为noOfInstances4。一旦关闭实例,该值将减少 1。对于安装我正在写的更新:-

if(noOfInstances == 1)
{
   InstallUpdates();
}

现在我的问题是如何以编程方式跟踪我的项目是否打开了一个实例?每个实例可能有一些我无法识别的唯一 ID。我正在使用 windows 环境来开发我的 c# 应用程序。

4

4 回答 4

2

全局互斥锁可能是一种更好的机制,可以更好地控制对仅一次函数的访问。在这种情况下,我会尝试获取一个短暂超时的互斥锁。如果您未能获得它 - 其他人拥有它。如果成功,请测试是否需要更新,如果需要,请安装更新。

优化可能是将测试移到互斥锁之外 - 但如果在互斥锁范围内需要更新,您仍然需要重新测试。

在 C# 中使用全局互斥锁的好模式是什么?

于 2012-05-16T06:16:44.257 回答
0

您可以像这样获得正在运行的进程:

using System.Diagnostics;

int GetInstanceCount(ExeName)
{
    Process[] processlist = Process.GetProcessesByName(ExeName);
    int NoOfInstances = processlist.Count;
    return NoOfInstances;
}

现在像这样实现:

string ExeName = "notepad.exe"//Say Notepad
if(GetInstanceCount(ExeName) == 1)
{
   InstallUpdates();
}
于 2012-05-16T06:16:24.970 回答
0

您可以使用Process.GetProcesses按名称获取进程

var processes = Process.GetProcesses Method (ProcessName)
if (processes!= null)
{
  int runningInstances = processes.Length;
}
于 2012-05-16T06:16:36.707 回答
0

虽然我过去实现了@stephbu 的互斥模式,但最近的要求是,如果程序启动两次,则应该将正在运行的实例置于最前面。

为此,我尝试连接到命名管道。如果我无法连接,这是第一个实例,我创建命名管道然后正常执行操作。如果我可以连接,这是第二个实例,我通过管道发送命令并退出。

在命名管道上接收命令我可以做任何我想做的事情,比如把主窗口带到顶部。

但是,此解决方案仅在您确实想对管道进行上述操作时才有意义。如果您只想阻止应用程序运行两次,@stephbu 的 mutex 答案是可行的方法。

于 2012-05-16T06:30:59.160 回答