c# 多線程 互斥量

我們在做程序時,有時候希望在一臺電腦上面只有一個進程實例在運行,利用Mutex互斥量可以實現了這個功能,方法及步驟如下:

接下來分控制檯程序和Winform程序兩種情況下實現此功能

1.控制檯程序

[csharp] view plain copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Threading;  
  6.   
  7. namespace myConApp  
  8. {  
  9.     class Test  
  10.     {  
  11.         /// <summary>  
  12.         /// 應用程序的主入口點。  
  13.         /// </summary>  
  14.         [STAThread]  
  15.         static void Main(string[] args)  
  16.         {  
  17.             bool flag = false;  
  18.             System.Threading.Mutex mutex = new System.Threading.Mutex(true"Test"out flag);  
  19.             //第一個參數:true--給調用線程賦予互斥體的初始所屬權  
  20.             //第一個參數:互斥體的名稱  
  21.             //第三個參數:返回值,如果調用線程已被授予互斥體的初始所屬權,則返回true  
  22.             if (flag)  
  23.             {  
  24.                 Console.Write("Running");  
  25.             }  
  26.             else  
  27.             {  
  28.                 Console.Write("Another is Running");  
  29.                 System.Threading.Thread.Sleep(5000);//線程掛起5秒鐘  
  30.                 Environment.Exit(1);//退出程序  
  31.             }  
  32.             Console.ReadLine();  
  33.   
  34.         }  
  35.     }  
  36. }  


 運行以上代碼生成的應用程序第一個實例,會得到結果

Running
 保持第一個運行狀態,運行第二個實例,得到結果

Another is Running
 以上代碼中創建了一個mutex,從其參數的解釋中得知,第一個調用線程將得到互斥體的初始所屬權,如果不釋放的話,其他的線程得不到互斥體所有權

2.Winform程序

Winform程序可以在構造函數中添加以下代碼即可實現,如下

[csharp] view plain copy
  1. public Form1()  
  2. {  
  3.     InitializeComponent();  
  4.     #region 只能運行一個客戶端程序  
  5.     bool flag = false;  
  6.     System.Threading.Mutex mutex = new System.Threading.Mutex(true"Test"out flag);  
  7.     //第一個參數:true--給調用線程賦予互斥體的初始所屬權  
  8.     //第一個參數:互斥體的名稱  
  9.     //第三個參數:返回值,如果調用線程已被授予互斥體的初始所屬權,則返回true  
  10.     if (!flag)  
  11.     {  
  12.         MessageBox.Show("只能運行一個客戶端程序!""請確定", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);  
  13.         Environment.Exit(1);//退出程序  
  14.     }  
  15.     #endregion  
  16.   
  17. }  

運行結果,在打開一個實例的情況下,再次運行該程序則彈出對話框

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章