2 回答

TA貢獻1875條經驗 獲得超3個贊
請考慮這個答案僅說明了這個想法,并且不包含可供使用的代碼:
private static Mutex Singleton = null;
...
var arguments = Environment.GetCommandLineArgs();
var mutexName = arguments[1];
Singleton = new Mutex(false, mutexName);
if(!Singleton.WaitOne(TimeSpan.Zero, true)) return; //end the process
或者
private static Mutex Singleton = null;
...
var arguments = Environment.GetCommandLineArgs();
var mutexName = arguments[1];
var isCreated = false;
Singleton = new Mutex(true, mutexName, isCreated);
if (!isCreated)
Environment.Exit(1); //end the process

TA貢獻2021條經驗 獲得超8個贊
根據該構造函數的Microsoft 文檔(強調我的):
如果 name 不為 null 并且 initialOwned 為 true,則調用線程僅在此調用創建了命名系統互斥鎖時才擁有互斥鎖。由于沒有確定是否創建了命名系統互斥鎖的機制,因此在調用此構造函數重載時最好為 initialOwned 指定 false。如果需要確定初始所有權,可以使用 Mutex(Boolean, String, Boolean) 構造函數。
將調用更改為為所有權參數傳入 false,您應該已準備就緒。
private static readonly Mutex SingletonA = new Mutex(
false,
"A");
private static readonly Mutex SingletonB = new Mutex(
false,
"B");
(雖然這個例子對其他人可能不是超級有用,因為第一個進程立即同時獲取 Mutex 單例,并且沒有關于它持有它們的時間、原因、進程何時或如何退出的上下文。)
- 2 回答
- 0 關注
- 133 瀏覽
添加回答
舉報