1

我有我必须启动多个实例的程序。

但是,如果当前实例是最后一个实例,我必须执行一些操作。

有什么办法吗?如果是,那我该怎么做?

4

5 回答 5

2
if(Process.GetProcessesByName("yourprogram").Length == 0)
{
    // It's the only instance!
}
于 2012-11-22T11:09:47.407 回答
2

最好的方法可能是计算正在运行的进程数

var count = System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count();
于 2012-11-22T11:08:27.347 回答
2

您可以获得与当前进程同名的进程列表并采取相应措施;

System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName("Name.of.process.here");
if(processes.Length == 1)
于 2012-11-22T11:08:29.260 回答
0

在 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. 
            }
        }
    }
}
于 2012-11-22T11:16:47.640 回答
0

您应该注意,所有其他应答器都不会订购应用程序实例。

您想如何订购您的应用程序?到开始时间?如果是这样,您可以为您的代码使用独立存储,在其中存储应用程序实例的上次启动日期,并将其与当前实例的开始日期进行比较(在您的应用程序中创建一个静态属性)。另见:MSDN 文章

如果您不想订购您的应用程序,只需使用Process.GetProcessesByName,只需将您的应用程序的名称传递给那里。

请注意,调试模式进程名称与发布模式进程名称不同

于 2012-11-22T11:19:56.270 回答