我有我必须启动多个实例的程序。
但是,如果当前实例是最后一个实例,我必须执行一些操作。
有什么办法吗?如果是,那我该怎么做?
if(Process.GetProcessesByName("yourprogram").Length == 0)
{
// It's the only instance!
}
最好的方法可能是计算正在运行的进程数
var count = System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count();
您可以获得与当前进程同名的进程列表并采取相应措施;
System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName("Name.of.process.here");
if(processes.Length == 1)
在 CLR via C# book by Jeffrey Richter 中,这是一个使用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,只需将您的应用程序的名称传递给那里。
请注意,调试模式进程名称与发布模式进程名称不同