我有程序,我必须启动多个实例。
但是,如果当前实例是最后一个实例,我必须执行一些操作。
有什么办法吗?如果是,那么我该怎么做?
if(Process.GetProcessesByName("yourprogram").Length == 0)
{
// It's the only instance!
}
您可以获得与当前进程同名的进程列表并采取相应的措施;
System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName("Name.of.process.here");
if(processes.Length == 1)
最好的方法可能是计算正在运行的进程的数量
var count = System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count();
在 Jeffrey Richter 的 CLR via C# 一书中,这是一个使用该类的示例Semaphore
:
using System;
using System.Threading;
public static class Program {
public static void Main() {
bool created;
using(new Semaphore(0, 1, "SomeUniqueStringIdentifyingMyApp", out created)) {
if(created) {
//This thread created kernel object so no other instance of this app must be running
} else {
//This thread opens existing kernel object with the same string name which means
//that another instance of this app must be running.
}
}
}
}
您应该注意,所有其他应答者不对应用程序实例进行排序。
您希望如何订购您的应用程序?到开始时间?如果是这样,则可以对代码使用独立存储,在其中存储应用程序实例上次启动的日期,并将其与此当前实例的开始日期进行比较(在应用程序中创建静态属性)。另请参阅:MSDN 文章。
如果您不想对应用程序进行排序,只需使用 Process.GetProcessesByName,只需为您的应用程序传递一个名称即可。
请注意,调试模式进程名称与发布模式进程名称不同