3 回答

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

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超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 () ;
當(dāng)您的進(jìn)程退出或終止時(shí),Windows將為您關(guān)閉事件,如果沒有剩余的打開句柄,則將其銷毀。
添加了:用于管理會話,事件(或互斥)名稱的使用Local\和Global\前綴。如果您的應(yīng)用程序是按用戶使用的,則只需在事件名稱后附加一個經(jīng)過適當(dāng)修飾的登錄用戶名即可。

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