建立一支程序,如果資源在同一時間只能夠被一支程序或執行序拿來使用,這時通常能夠用Mutex來解決此問題。至於想將資源限定於單一程序或是單一執行序內,使用方式也有所不同,千千百百種此篇不探討。本篇將要來探討,Mutex釋放的時間點,要使用ReleaseMutex來進行釋放,還是Close將Mutex釋放。
Mutex.Close()的使用範例
如果想限定單一程式不能夠重覆執行,或者是多個程序只能夠執行一個,能夠使用以下方式:
- 建立Global屬性,名為LockMute的Mutex變數
- 能夠在呼叫點寫下LockMutex?.Close()函數
- 建立Mutex Instance(此時Mutex已鎖住,任何程序都無法建立相同名稱的Mutex)
- 確認Mutex確實建立成功,如不成功則關閉當前程序(可自行定義處理方式)
1 2 3 4 |
using System.Threading; //LockMutex Global Property Mutex LockMutex {get; set;} = null; |
1 2 3 4 5 6 7 8 9 10 11 |
LockMutex?.Close(); LockMutex = new Mutex(true, appName, out bool ret); if(!ret) { //建立失敗,指定程式已被執行 //Create Fail! //To Do... //關閉當前程序 Environment.Exit(0); } |
Mutex.ReleaseMutex()的使用範例
如何在一個簡單的多線程應用程式中使用 Mutex 來確保對共享資源的安全訪問:
- mutex.WaitOne():取得控制權
- mutex.ReleaseMutex():釋放控制權
常見的使用方式,能夠透過多個Thread執行UsrFunction函數,但在同一時間點只會有一個UsrFunction執行//To Do…程序以下的內容,直到執行完成且運行了mutex.ReleaseMutex()函數,才會有下一個UsrFunction繼續執行,依此類推。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
void UsrFunction() { try { mutex.WaitOne(); //Handle Resources //To Do... } finally { mutex.ReleaseMutex(); } } |
以上是筆記的內容,簡單來說ReleaseMutex()使用時機是在單一程序內的多執行序的應用方式,而Close()是針對應用程序和應用程序之間的運用,有錯誤麻煩告知~ Thanks!