我有一个程序,我必须启动多个实例。
但是,如果当前实例是最后一个实例,我必须执行一些操作。
有没有办法这样做?如果是,那我该怎么做?
答案 0 :(得分:2)
最好的方法可能是计算正在运行的进程数
var count = System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count();
答案 1 :(得分:2)
您可以获得与当前名称相同的进程列表并相应地执行操作;
System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName("Name.of.process.here");
if(processes.Length == 1)
答案 2 :(得分:2)
if(Process.GetProcessesByName("yourprogram").Length == 0)
{
// It's the only instance!
}
答案 3 :(得分:0)
在Jeffrey Richter的CLR via C#book中,这是一个使用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.
}
}
}
}
答案 4 :(得分:0)
您应该注意,所有其他回答者都没有订购应用程序实例。
您想如何订购应用程序?到开始时间?如果是这样,您可以使用Isolated storage作为代码,存储应用程序实例上次启动的日期,并将其与当前实例的开始日期进行比较(在应用程序中创建静态属性)。另见:MSDN article。
如果您不想订购应用程序,只需使用Process.GetProcessesByName,只需为您的应用程序传递一个名称即可。
请注意,调试模式进程名称与发布模式进程名称
不同