亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

防止同一應用程序同時運行但基于輸入參數

防止同一應用程序同時運行但基于輸入參數

C#
冉冉說 2022-06-19 16:35:34
我想阻止實例針對從命令行輸入的特定參數運行。如果它們都采用不同的參數,我想允許多個實例運行。這是我試圖實現這一點的代碼片段:private static readonly Mutex SingletonA = new Mutex(true, "A");private static readonly Mutex SingletonB = new Mutex(true, "B");var arguments = Environment.GetCommandLineArgs();if(arguments[1]=="A" && !SingletonA.WaitOne(TimeSpan.Zero, true)) return; //end the processif(arguments[1]=="B" && !SingletonB.WaitOne(TimeSpan.Zero, true)) return; //end the process但是我注意到如果有一個正在運行的實例,SingletonA 和 SingletonB 都將是錯誤的。有沒有辦法實現它?
查看完整描述

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  


查看完整回答
反對 回復 2022-06-19
?
寶慕林4294392

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 單例,并且沒有關于它持有它們的時間、原因、進程何時或如何退出的上下文。)


查看完整回答
反對 回復 2022-06-19
  • 2 回答
  • 0 關注
  • 133 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號