狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

C# WinForms 開發中防止同一應用運行多個實例

admin
2024年7月23日 15:40 本文熱度 699

在開發 WinForms 應用程序時,有時需要防止同一個應用程序的多個實例同時運行。這種需求在某些情況下非常重要,例如,當你需要確保某個資源(如文件或數據庫)只被一個應用實例訪問時。

本文將介紹幾種防止同一應用運行多個實例的方法,提供詳細的代碼示例,并輸出為 Markdown 格式。

方法一:使用 Mutex 類

Mutex(互斥量)是一個同步基元,它可以用于跨線程和進程同步。通過創建一個命名互斥量,可以防止應用運行多個實例。

示例代碼

namespace SingleInstanceApp{    internal static class Program    {        private static Mutex mutex = null;        /// <summary>        ///  The main entry point for the application.        /// </summary>        [STAThread]        static void Main()        {            const string mutexName = "MyApp";            bool isOwned;
           mutex = new Mutex(true, mutexName, out isOwned);
           if (!isOwned)            {                MessageBox.Show("應用程序已經在運行中。", "多實例檢測", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);                return;            }            // To customize application configuration such as set high DPI settings or default font,            // see https://aka.ms/applicationconfiguration.            ApplicationConfiguration.Initialize();            Application.Run(new Form1());
           GC.KeepAlive(mutex);        }    }}

在上述代碼中,我們使用 Mutex 類創建了一個系統全局命名的互斥體 mutexName。如果應用程序已經在運行,則 isOwned 將為 false,應用會顯示一條消息并退出。

方法二:使用 Process 類

通過 Process 類檢查當前是否已經有同名進程在運行,也可以防止多個實例的運行。

示例代碼

using System.Diagnostics;
namespace SingleInstanceApp{    internal static class Program    {        /// <summary>        ///  The main entry point for the application.        /// </summary>        [STAThread]        static void Main()        {            if (IsAlreadyRunning())            {                MessageBox.Show("應用程序已經在運行中。", "多實例檢測", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);                return;            }            // To customize application configuration such as set high DPI settings or default font,            // see https://aka.ms/applicationconfiguration.            ApplicationConfiguration.Initialize();            Application.Run(new Form1());        }
       static bool IsAlreadyRunning()        {            string currentProcessName = Process.GetCurrentProcess().ProcessName;            Process[] processes = Process.GetProcessesByName(currentProcessName);            return processes.Length > 1;        }    }}

此方法通過 Process.GetProcessesByName 方法獲取當前運行的同名進程。如果長度大于1,說明此時已有另一個實例在運行。

方法三:使用 Windows API

還有一種方法是利用 Windows API 創建一個命名事件,檢查該事件是否已經存在。

示例代碼

using System.Diagnostics;using System.Runtime.InteropServices;
namespace SingleInstanceApp{    internal static class Program    {        const string UniqueEventName = "Global\\MyApp";
       [DllImport("kernel32", SetLastError = true)]        static extern IntPtr CreateEvent(IntPtr lpEventAttributes, bool bManualReset, bool bInitialState, string lpName);
       [DllImport("kernel32.dll")]        static extern uint GetLastError();        /// <summary>        ///  The main entry point for the application.        /// </summary>        [STAThread]        static void Main()        {            IntPtr handle = CreateEvent(IntPtr.Zero, false, false, UniqueEventName);            if (handle == IntPtr.Zero || GetLastError() == 183) // ERROR_ALREADY_EXISTS (183)            {                MessageBox.Show("應用程序已經在運行中。", "多實例檢測", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);                return;            }
           // To customize application configuration such as set high DPI settings or default font,            // see https://aka.ms/applicationconfiguration.            ApplicationConfiguration.Initialize();            Application.Run(new Form1());        }    }}

上述代碼使用了 CreateEvent API 創建一個命名事件,并通過 GetLastError 檢查事件是否已經存在(錯誤代碼 183 表示該事件已存在)。

CreateEvent 是一個 Windows API 函數,用于創建或打開一個命名的或未命名的事件對象。事件對象在進程間和線程間同步中非常有用。

GetLastError() 函數是用于檢索擴展的錯誤信息的函數。它通常與其他 Windows API 函數一起使用,這些函數不返回明確的錯誤代碼,但是如果調用失敗,可以通過 GetLastError() 獲取詳細的錯誤信息。

總結

以上介紹了三種在 WinForms 開發中防止同一應用運行多個實例的方法:

  1. 使用 Mutex 類。

  2. 使用 Process 類。

  3. 使用 Windows API。

每種方法都有其優點和適用場景,開發者可根據具體需求選擇合適的方法來實現多實例檢測功能。希望此文對你有所幫助,歡迎提出任何問題或建議。


該文章在 2024/7/23 22:28:12 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved