簡體   English   中英

防止ac#應用程序運行多個實例

[英]prevent a c# application from running more than one instance

我在c#中編寫了一個程序,現在我想知道如果程序已經運行,阻止程序啟動的正確方法是什么?

因此,如果它已經在運行,並且雙擊該程序,它將無法啟動,因為它已經在運行。

我可以這樣做,但我正在考慮一種標准和正確的方式。

建議的方法是使用系統互斥鎖。

bool createdNew;
using(var mutex = new System.Threading.Mutex(true, "MyAppName", out createdNew))
{
    if (createdNew)
        // first instance
        Application.Run();
    else
        MessageBox.Show("There is already an instace running");
}

Mutex ctor的第一個參數告訴它為該線程創建一個系統范圍的互斥鎖。 如果互斥鎖已經存在,它將通過第3個參數返回false

更新
把它放在哪里? 我把它放在program.cs中。 如果將其放在form_load中,則需要在應用程序的生命周期內保留互斥鎖(將互斥鎖作為表單上的成員),然后以卸載形式手動釋放它。
在其他應用程序打開數據庫連接等之前以及為表單/控件等創建資源之前,您越早調用它越好。

我在其中一個應用程序中執行的快速方法。您可以查看正在運行的進程列表,以查看當前應用程序是否已在運行而不是再次啟動應用程序。

Process[] lprcTestApp = Process.GetProcessesByName("TestApplication");
if (lprcTestApp.Length > 0)
{
      // The TestApplication is already running, don't run it again
}

我認為枚舉進程列表可能會很慢。 您還可以使用System.Threading.Mutex類創建一個Mutex,並檢查它是否已在進程啟動時創建。 但是,這需要調用Win32系統代碼,因此不會完全與平台無關。

看一下Scotts博客文章 ,不要被程序集名稱弄得愚蠢。 它只是.Net框架中標准文件的文件名。

以下是MSFor for WindowsFormsApplicationBase的更多信息。

您可以使用系統范圍的信號量 ,使用信號量構造函數(Int32,Int32,String,Boolean%)構造函數和一個相當獨特的名稱。

干杯,馬蒂亞斯

如果您的應用程序生成/使用文件,那么您最好注冊系統范圍的通信機制(例如遠程處理或WCF端點,甚至是套接字)。 然后,如果通過雙擊其中一個文件啟動應用程序的第二個實例,則可以將文件信息發送到正在運行的實例。

否則,如果它是一個獨立的程序,那么正如其他人所說的那樣,Mutex或Semaphore同樣可以服務。

Windows窗體應用程序中的解決方案禁止再次運行應用程序(重新打開應用程序)。

1-首先添加Class RunAlready.cs

2-Call方法processIsRunning(),帶ProgramCs中RunAlready.cs的Name Process

Program.cs中:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Tirage.MainStand
{
static class Program
{

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        PublicClass.Class.RunAlready RunAPP = new PublicClass.Class.RunAlready();
        string outApp = RunAPP.processIsRunning("Tirage.MainStand");

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        MainStand_FrmLogin fLogin = new MainStand_FrmLogin();
        if (outApp.Length == 0)
        {

            if (fLogin.ShowDialog() == DialogResult.OK)
            {
                Application.Run(new MainStand_masterFrm());

            }
        }
        else MessageBox.Show( "Instance already running");

      }
    }
 }

類RunAlready:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PublicClass.Class
{
  public  class RunAlready
    {
      public  string processIsRunning(string process)
        {
        string xdescription = "";
        System.Diagnostics.Process[] processes =
            System.Diagnostics.Process.GetProcessesByName(process);
        foreach (System.Diagnostics.Process proc in processes)
        {
            var iddd = System.Diagnostics.Process.GetCurrentProcess().Id;
            if (proc.Id != System.Diagnostics.Process.GetCurrentProcess().Id)
            {
                xdescription = "Application Run At time:" + proc.StartTime.ToString() + System.Environment.NewLine;
                xdescription += "Current physical memory : " + proc.WorkingSet64.ToString() + System.Environment.NewLine;
                xdescription += "Total processor time : " + proc.TotalProcessorTime.ToString() + System.Environment.NewLine;
                xdescription += "Virtual memory size : " +         proc.VirtualMemorySize64.ToString() + System.Environment.NewLine;
            }
        }


        return xdescription;
    }
}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM