2018年1月16日 星期二

c# Mutex 探究

http://arthurmvc.blogspot.tw/2013/09/netlock.html

Mutex(bool, string, out bool): 第三個輸入參數用來指示是否取得同步鎖,是實務中較常用到的。

 //isAppRunning = false表示已執行,沒有拿到權仗,若拿到權杖則為true
 //blLock = false表示已執行,沒有拿到權仗,若拿到權杖則為true
bool blLock;
Mutex mutex = new Mutex( true, @"Global\MyAPP", out blLock);
try {
   if(blLock)
      //工作
   else
      //等待同步鎖
}
finally {
    mutex.ReleaseMutex();
}

範例

namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //label1.Text= System.AppDomain.CurrentDomain.BaseDirectory; label1.Text = Process.GetCurrentProcess().ProcessName; } private void button2_Click(object sender, EventArgs e) { bool flag = false; System.Threading.Mutex mutex = new System.Threading.Mutex(true, Process.GetCurrentProcess().ProcessName, out flag); //第一個參數:true--給調用執行緒賦予互斥體的初始所屬權 //第一個參數:互斥體的名稱 //第三個參數:返回值,如果調用執行緒已被授予互斥體的初始所屬權,則返回true //flag為true表示取得第一次啟動權,也就是同步鎖
if (flag) { label2.Text = "啟動"; } else { label2.Text = "另一隻已在跑"; System.Threading.Thread.Sleep(5000);//執行緒掛起5秒鐘 //請勿使用this.close(); 會有錯誤發生 Environment.Exit(Environment.ExitCode);//退出程式 } } private void button3_Click(object sender, EventArgs e) { bool flag = false; System.Threading.Mutex mutex = new System.Threading.Mutex(true, Process.GetCurrentProcess().ProcessName, out flag); //第一個參數:true--給調用執行緒賦予互斥體的初始所屬權 //第一個參數:互斥體的名稱 //第三個參數:返回值,如果調用執行緒已被授予互斥體的初始所屬權,則返回true //flag為true表示取得第一次啟動權,也就是同步鎖
if (flag) { label2.Text = "程式啟動執行"; } else { //bnt2先按了.因為在同一隻程式.webform已被鎖定.所以label3.Text不會出現
label3.Text = "另一隻已經在跑了";

//直接執行下列 System.Threading.Thread.Sleep(5000);//執行緒掛起5秒鐘 //請勿使用this.close(); 會有錯誤發生(因為在同一隻程式.webform已被鎖定)
Environment.Exit(Environment.ExitCode);//退出程式 } } } }

沒有留言:

張貼留言