程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> .Net平台下使應用程序只運行一個實例

.Net平台下使應用程序只運行一個實例

編輯:.NET實例教程

摘要:

   本文闡述了在基於.Net平台的應用程序開發中如何實現唯一應用程序運行實例,對幾種實現方式進行分析測試比較,從而尋找一種合適的處理方式。單擊此處才查看本文的示例代碼。


概述

   在開發一些應用系統的時候,由於程序內在的一些特征,系統的某些組成子程序只允許運行一個應用程序實例,以保證業務和數據處理安全。本文將從實際應用角度來分析其實現原理,對三種實現方式進行測試比較,從而確定一種合適的實現方法。文章的例子使用C#語言進行描述。

進程匹配

    對於每一個應用程序運行實例都會包含該實例的一個或多個進程,而且在程序運行過程中可能會動態的創建或銷毀進程,或者訪問其他現有進程進行通信。不難發現,在程序最先初始化的那一刻只有一個進程運行,而且應用程序進程生命周期最大進程名稱集合是不變的。因此,在應用程序初始化的時候,可以根據進程關鍵信息檢查系統進程列表是否存在同當前初始化進程匹配的進程來確定是否已經運行進程實例。
邏輯處理步驟如下,
1.初始化應用程序,啟動程序初始化進程;
2.訪問系統進程列表,根據初始化進程關鍵信息進行匹配查找;
3.沒有找到匹配進程(這一步是不會發生的,因為當前初始化進程也在列表中,不過還要看獲取進程列表的實現代碼怎麼寫),繼續初始化進程,程序初始化完成運行。
4.找到第一個匹配進程,判斷找到的進程ID是否同初始化進程ID相同;
5.如果第一個匹配進程ID同初始化進程ID相同,則為當前初始化進程,繼續查找;
6.沒有找到第二個匹配進程,表明當前運行的是首個實例,繼續初始化進程,程序初始化完成運行。
7.找到第二個,表明已有一個實例在運行,停止當前程序初始化,提示已有應用程序運行。
8.如果找到第一個匹配進程ID不同,表明已有一個實例在運行,停止當前程序初始化,提示已有應用程序運行。

     可見上面的邏輯實現中用於進程匹配的信息是關鍵,選擇不當功能就無法實現。在這個實例中筆者使用了應用程序完全文件名稱作為關鍵信息。
在代碼中首先需要引用下面命名空間,以調用WinAPI函數。
using System.Runtime.InteropServices;
把實現唯一運行實例功能的類名取為SingleInstance,在類前面加static關鍵字為C# 2.0新增的語言特征。
public static class SingleInstance {}
使用GetRunningInstance靜態方法獲取應用程序進程實例,如果沒有匹配進程,返回Null值,
public static Process GetRunningInstance()
{
        Process currentProcess = Process.GetCurrentProcess(); //獲取當前進程
        //獲取當前運行程序完全限定名 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved