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

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

是否使用Mutex防止同一程序的多個實例安全運行?

是否使用Mutex防止同一程序的多個實例安全運行?

C#
慕碼人8056858 2019-10-17 12:53:15
我正在使用此代碼來防止我的程序的第二個實例同時運行,這安全嗎?Mutex appSingleton = new System.Threading.Mutex(false, "MyAppSingleInstnceMutx");if (appSingleton.WaitOne(0, false)) {    Application.EnableVisualStyles();    Application.SetCompatibleTextRenderingDefault(false);    Application.Run(new MainForm());    appSingleton.Close();} else {    MessageBox.Show("Sorry, only one instance of MyApp is allowed.");}我擔心如果發生異常并且應用程序崩潰,則Mutex仍將保留。真的嗎?
查看完整描述

3 回答

?
紅糖糍粑

TA貢獻1815條經驗 獲得超6個贊

通常,這是可行的。然而,細節在于魔鬼。

首先,您要關閉一個finally塊中的互斥量。否則,您的進程可能會突然終止,并使其處于信號狀態,例如異常。這樣可以使將來的流程實例無法啟動。

但是,不幸的是,即使有一個finally塊,您也必須處理一個潛在的問題,即在不釋放互斥量的情況下終止進程。例如,如果用戶通過TaskManager終止了進程,則可能發生這種情況。有一個在你的代碼中的競爭條件,將允許第二處理,得到AbandonedMutexExceptionWaitOne通話。您將需要一個恢復策略。

我鼓勵您閱讀Mutex類的詳細信息。使用它并不總是那么簡單。


擴展種族條件的可能性:

可能發生以下事件序列,這將導致應用程序的第二個實例拋出:

  1. 正常流程啟動。

  2. 第二個進程啟動并獲取互斥鎖的句柄,但在WaitOne調用之前已被關閉。

  3. 進程#1突然終止?;コ怏w不會被破壞,因為進程2具有句柄。而是將其設置為放棄狀態。

  4. 第二個進程再次開始運行并得到一個AbanonedMutexException。


查看完整回答
反對 回復 2019-10-17
?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

為此目的,使用Windows事件更為常見和方便。例如


static EventWaitHandle s_event ;


bool created ;

s_event = new EventWaitHandle (false, 

    EventResetMode.ManualReset, "my program#startup", out created) ;

if (created) Launch () ;

else         Exit   () ;

當您的進程退出或終止時,Windows將為您關閉事件,如果沒有剩余的打開句柄,則將其銷毀。


添加了:用于管理會話,事件(或互斥)名稱的使用Local\和Global\前綴。如果您的應用程序是按用戶使用的,則只需在事件名稱后附加一個經過適當修飾的登錄用戶名即可。


查看完整回答
反對 回復 2019-10-17
?
有只小跳蛙

TA貢獻1824條經驗 獲得超8個贊

您可以使用互斥鎖,但首先請確保這確實是您想要的。

因為沒有明確定義“避免多個實例”。這可能意味著

  1. 不管該用戶會話具有多少個桌面,都應避免在同一用戶會話中啟動多個實例,而應允許多個實例同時為不同的用戶會話運行。

  2. 避免在同一桌面上啟動多個實例,但是只要每個實例都在單獨的桌面上,就允許多個實例運行。

  3. 無論存在多少個桌面或以該帳戶運行的會話,都應避免為同一用戶帳戶啟動多個實例,但要允許以不同用戶帳戶運行的會話同時運行多個實例。

  4. 避免在同一臺計算機上啟動多個實例。這意味著無論任意數量的用戶使用多少個桌面,最多都可以運行該程序的一個實例。

通過使用互斥鎖,基本上就是在使用定義數字4。


查看完整回答
反對 回復 2019-10-17
  • 3 回答
  • 0 關注
  • 635 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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