如何检查应用程序的另一个实例是不是正在运行[重复]
Posted
技术标签:
【中文标题】如何检查应用程序的另一个实例是不是正在运行[重复]【英文标题】:How to check if another instance of the application is running [duplicate]如何检查应用程序的另一个实例是否正在运行[重复] 【发布时间】:2011-06-17 21:26:36 【问题描述】:有人可以说明如何检查程序的另一个实例(例如 test.exe)是否正在运行,如果存在则停止加载应用程序。
【问题讨论】:
见***.com/questions/94274/…和***.com/questions/184084/… codeproject.com/KB/cs/restricting_instances.aspx @Tim Schmelter 谢谢,但这是一个 GUI 应用程序,我的是一个控制台应用程序 【参考方案1】:想要一些严肃的代码吗?这里是。
var exists = System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count() > 1;
这适用于任何应用程序(任何名称),如果有另一个实例在运行相同应用程序,它将变为true
。
编辑:要解决您的需求,您可以使用以下任何一种:
if (System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count() > 1) return;
从您的 Main 方法退出该方法...或
if (System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count() > 1) System.Diagnostics.Process.GetCurrentProcess().Kill();
这将立即终止当前的加载过程。
您需要为.Count()
扩展方法添加对System.Core.dll的引用。或者,您可以使用.Length
属性。
【讨论】:
在第二个 sn-p 中返回只会使两个应用程序都死掉,所以现在运行的是 0 而不是 2。 @dsp_099 除非它们都在几乎完全相同的时间启动,或者有人以某种方式在无限循环中运行此代码,否则它们不会。你可以在那里清楚地看到.Count > 1
。
是的,对我来说效果不佳,因为这两个应用程序是通过 msconfig / autostart 执行的,总是双启动
@dsp_099 在这种情况下,需要互斥体才能正确检测和处理。有很多关于这个主题的信息。
@Vercas 这在终端服务器上不起作用【参考方案2】:
不确定您所说的“程序”是什么意思,但如果您想将应用程序限制为一个实例,那么您可以使用互斥锁来确保您的应用程序尚未运行。
[STAThread]
static void Main()
Mutex mutex = new System.Threading.Mutex(false, "MyUniqueMutexName");
try
if (mutex.WaitOne(0, false))
// Run the application
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
else
MessageBox.Show("An instance of the application is already running.");
finally
if (mutex != null)
mutex.Close();
mutex = null;
【讨论】:
如果你的程序被“硬杀”会怎样?说如果程序崩溃或进程资源管理器被用来以“不友好的方式”杀死应用程序?解决它的唯一方法是重置电脑吗? @TamusJRoyce 不,如果您阅读 MSDN 文档,它清楚地指出,如果 Mutex 被放弃,下一个等待线程将获得它的所有权。 这是正确答案,其他答案对 ex 无效。如果我用另一个名字复制了 exe。 这是唯一有效的答案;接受的答案不是很好 “将您的应用程序限制为一个实例”在第二个实例正在运行时会导致错误 - 它还没有走远。仍然是检测另一个实例是否正在运行的好方法。【参考方案3】:这里有一些很好的示例应用程序。以下是一种可能的方法。
public static Process RunningInstance()
Process current = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName (current.ProcessName);
//Loop through the running processes in with the same name
foreach (Process process in processes)
//Ignore the current process
if (process.Id != current.Id)
//Make sure that the process is running from the exe file.
if (Assembly.GetExecutingAssembly().Location.
Replace("/", "\\") == current.MainModule.FileName)
//Return the other process instance.
return process;
//No other instance was found, return null.
return null;
if (MainForm.RunningInstance() != null)
MessageBox.Show("Duplicate Instance");
//TODO:
//Your application logic for duplicate
//instances would go here.
许多其他可能的方式。请参阅替代方案示例。
First one.
Second One.
Third One
编辑 1:刚刚看到您有一个控制台应用程序的评论。 second sample.
对此进行了讨论【讨论】:
一个 upvote+ 因为这有效,但不幸的是,在我的情况下,我需要在终端服务器上运行它。由于它不是特定于用户的,因此在这种情况下它失败了,因为服务器上一次只有一个用户可以运行它。【参考方案4】:Process 静态类有一个 GetProcessesByName() 方法,您可以使用它来搜索正在运行的进程。只需搜索具有相同可执行名称的任何其他进程。
【讨论】:
【参考方案5】:你可以试试这个
Process[] processes = Process.GetProcessesByName("processname");
foreach (Process p in processes)
IntPtr pFoundWindow = p.MainWindowHandle;
// Do something with the handle...
//
【讨论】:
@R Quijano 这是一种安全/可靠的方式吗? @R Quijano 如果您启动相同的可执行文件,这将不起作用!!以上是关于如何检查应用程序的另一个实例是不是正在运行[重复]的主要内容,如果未能解决你的问题,请参考以下文章
我如何检查运行我的应用程序的 Android 设备是不是在 4.2.2 及更低版本上运行 [重复]
与使用 Pyspark 的另一个表相比,检查数据框中是不是存在重复项 [重复]