检测它是否是应用程序的最后一个实例c#

时间:2012-11-22 11:04:55

标签: c# .net multiple-instances

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

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

有没有办法这样做?如果是,那我该怎么做?

5 个答案:

答案 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,只需为您的应用程序传递一个名称即可。

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

不同