亚洲乱色熟女一区二区三区丝袜,天堂√中文最新版在线,亚洲精品乱码久久久久久蜜桃图片,香蕉久久久久久av成人,欧美丰满熟妇bbb久久久

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

C# WinForms 開發(fā)中防止同一應(yīng)用運行多個實例

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

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

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

方法一:使用 Mutex 類

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

示例代碼

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("應(yīng)用程序已經(jīng)在運行中。", "多實例檢測", 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 類創(chuàng)建了一個系統(tǒng)全局命名的互斥體 mutexName。如果應(yīng)用程序已經(jīng)在運行,則 isOwned 將為 false,應(yīng)用會顯示一條消息并退出。

方法二:使用 Process 類

通過 Process 類檢查當(dāng)前是否已經(jīng)有同名進(jìn)程在運行,也可以防止多個實例的運行。

示例代碼

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("應(yīng)用程序已經(jīng)在運行中。", "多實例檢測", 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 方法獲取當(dāng)前運行的同名進(jìn)程。如果長度大于1,說明此時已有另一個實例在運行。

方法三:使用 Windows API

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

示例代碼

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("應(yīng)用程序已經(jīng)在運行中。", "多實例檢測", 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 創(chuàng)建一個命名事件,并通過 GetLastError 檢查事件是否已經(jīng)存在(錯誤代碼 183 表示該事件已存在)。

CreateEvent 是一個 Windows API 函數(shù),用于創(chuàng)建或打開一個命名的或未命名的事件對象。事件對象在進(jìn)程間和線程間同步中非常有用。

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

總結(jié)

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

  1. 使用 Mutex 類。

  2. 使用 Process 類。

  3. 使用 Windows API。

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


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