3 回答

TA貢獻1815條經驗 獲得超6個贊
通常,這是可行的。然而,細節在于魔鬼。
首先,您要關閉一個finally
塊中的互斥量。否則,您的進程可能會突然終止,并使其處于信號狀態,例如異常。這樣可以使將來的流程實例無法啟動。
但是,不幸的是,即使有一個finally
塊,您也必須處理一個潛在的問題,即在不釋放互斥量的情況下終止進程。例如,如果用戶通過TaskManager終止了進程,則可能發生這種情況。有一個在你的代碼中的競爭條件,將允許第二處理,得到AbandonedMutexException
的WaitOne
通話。您將需要一個恢復策略。
我鼓勵您閱讀Mutex類的詳細信息。使用它并不總是那么簡單。
擴展種族條件的可能性:
可能發生以下事件序列,這將導致應用程序的第二個實例拋出:
正常流程啟動。
第二個進程啟動并獲取互斥鎖的句柄,但在
WaitOne
調用之前已被關閉。進程#1突然終止?;コ怏w不會被破壞,因為進程2具有句柄。而是將其設置為放棄狀態。
第二個進程再次開始運行并得到一個
AbanonedMutexException
。

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\前綴。如果您的應用程序是按用戶使用的,則只需在事件名稱后附加一個經過適當修飾的登錄用戶名即可。

TA貢獻1824條經驗 獲得超8個贊
您可以使用互斥鎖,但首先請確保這確實是您想要的。
因為沒有明確定義“避免多個實例”。這可能意味著
不管該用戶會話具有多少個桌面,都應避免在同一用戶會話中啟動多個實例,而應允許多個實例同時為不同的用戶會話運行。
避免在同一桌面上啟動多個實例,但是只要每個實例都在單獨的桌面上,就允許多個實例運行。
無論存在多少個桌面或以該帳戶運行的會話,都應避免為同一用戶帳戶啟動多個實例,但要允許以不同用戶帳戶運行的會話同時運行多個實例。
避免在同一臺計算機上啟動多個實例。這意味著無論任意數量的用戶使用多少個桌面,最多都可以運行該程序的一個實例。
通過使用互斥鎖,基本上就是在使用定義數字4。
- 3 回答
- 0 關注
- 635 瀏覽
添加回答
舉報