如何确保我的应用程序只有一个正在运行的实例?

时间:2012-08-30 07:36:12

标签: wpf

我在WPF中创建了一个小程序。当我运行我的exe文件时,它将正确打开我的应用程序。但是,当我再次运行我的exe时,它会打开另一个时间。我只想运行一次。

我在解决方案中搜索了这个问题,我得到了一些代码:

System.Diagnostics.Process.GetCurrentProcess().Kill();

此代码将关闭所有应用程序。但是,我需要的是当我一次又一次地运行我的exe时,只会有一个应用程序实例。

2 个答案:

答案 0 :(得分:0)

如果我理解正确,您希望应用程序在再次打开同一个文件时只打开一次。

执行此操作的方法不是通过终止进程(可能损坏文件),而是通过立即关闭新打开的应用程序。

保留一个打开文件列表,其中包括中心(注册表,文件)以及应用程序启动时检查文件是否已在列表中。如果它是关闭刚刚开始的应用程序。

您可以尝试添加一些代码,将包含所请求文件的应用程序放到桌面顶部。

答案 1 :(得分:0)

您可以使用Mutex类。

  • 由于每个系统总是只有一个具有特定名称的互斥锁,您可以在第一个的启动期间实现申请开始。
  • 如果应用程序实例可以拥有互斥锁,则可以在每次启动应用程序时进行检查。
  • 如果没有,您知道已存在该应用程序的另一个实例,并且可以正常关闭新实例。

使用Mutex非常简单易行。

using System;
using System.Threading;

public class Test
{
    public static void Main()
    {
        // Set this variable to false if you do not want to request  
        // initial ownership of the named mutex. 
        bool requestInitialOwnership = true;
        bool mutexWasCreated;

        // Request initial ownership of the named mutex by passing 
        // true for the first parameter. Only one system object named  
        // "MyMutex" can exist; the local Mutex object represents 
        // this system object. If "MyMutex" is created by this call,
        // then mutexWasCreated contains true; otherwise, it contains 
        // false.
        Mutex m = new Mutex(requestInitialOwnership, 
                            "MyMutex", 
                            out mutexWasCreated);

        // This thread owns the mutex only if it both requested  
        // initial ownership and created the named mutex. Otherwise, 
        // it can request the named mutex by calling WaitOne. 
        if (!(requestInitialOwnership && mutexWasCreated))
        {
           // The mutex is already owned by another application instance.
           // Close gracefully.

           // Put your exit code here...
           // For WPF, this would be Application.Current.Shutdown();
           // (Obviously, that would not work in this Console example.. :-) )
        }

        // Your application code here...
    }
}