2012-05-16 64 views
1

我想确保我的项目中安装更新的互斥。
该项目是多实例意味着可以打开一个实例而不关闭其他打开的实例。有一个称为installUpdates()的功能,它安装可用更新。由于有几个实例,因此只有其中一个需要安装更新。我想确保只有一个实例会安装更新。
我正在将一个全局变量noOfInstances(信号量)初始化为0。一旦打开一个新实例,变量就会增加1.如果有4个打开的实例,则noOfInstances的值将为4.一旦实例关闭,值将减少1.为了安装我写的更新: -如何在C#中跟踪应用程序的打开实例

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

现在我的问题是,如何以编程方式追踪有打开我的项目的一个实例?每个实例可能都有一些我无法识别的独特Id。我正在使用Windows环境来开发我的C#应用​​程序。

+0

您可以获取打开的进程并在其中搜索进程名称。 – Writwick

+0

我不确定这里的信号量是否可用。如果您的应用程序将从任务管理器关闭,会怎样?柜台会减少吗? – 6opuc

+0

@ 6opuc是的,在这种情况下,柜台也应该减少。 – Jaguar

回答

2

全局互斥锁可能是一种更好的机制,可以将访问权限设置为仅限一次的功能。在这种情况下,我会尝试在短时间内获取互斥锁。如果你没有获得它 - 别人拥有它。如果成功,请测试是否有必要进行更新,如果是,则安装更新。

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

What is a good pattern for using a Global Mutex in C#?

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(); 
} 
0

可以使用Process.GetProcesses通过名称获取过程

var processes = Process.GetProcesses Method (ProcessName) 
if (processes!= null) 
{ 
    int runningInstances = processes.Length; 
} 
0

虽然我已经实现@过去stephbu的互斥模式,要求最近一直是,如果程序启动了两次运行实例应提请前面。

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

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

但是,这种解决方案只有在您真的想像上面描述的那样对管道做某些事情时才有意义。如果您只想阻止应用程序运行两次,那么@ stephbu的互斥锁答案就是要走的路。

+0

Mutex最常见的用途是多实例预防,但没有内在地阻止多实例使用Mutex策略。唯一的区别是在检测到无法获取Mutex时发生 - 在这种情况下退出。 – stephbu