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);//退出程式
}
}
}
}
沒有留言:
張貼留言