2016-11-25 21 views
0

我在C#中創建了一個系統托盤應用程序,它只是在後臺運行。它使用Exchange Web服務監聽郵件服務器,並在每次收到郵件時執行一組操作。它使用了大量的Excel應用程序,如果我將程序轉換爲服務時不能正常工作(這就是爲什麼它必須是系統應用程序)。如何確保程序只在Windows Server 2012的所有會話中運行一次?

重要的是,程序不會一次運行多次。我添加了一個互斥鎖,因此我無法在同一個會話中多次運行該程序。但是,當我登錄Windows Server上的另一個會話(每個用戶可能有兩個會話)時,問題在於,該程序在系統托盤中不可見,我可以再次打開它,因此它運行兩次,每次運行一次會話。我如何防止這種情況?

感謝

+0

在例如文件中創建一個具有保留名稱的文件。 'C:\ temp'並保持鎖定,所以實例#2會注意並退出? –

+0

這是互斥體的名稱?如果互斥體名稱以全局\開始,則對所有終端服務會話都是全局的。您還應該檢查互斥鎖權限,以便所有用戶都可以訪問它。 –

+0

看到這個SO問題http://stackoverflow.com/questions/229565/what-is-a-good-pattern-for-using-a-global-mutex-in-c –

回答

0

您將看到這一切的過程:

using System.Diagnostics; 
var allProcceses = Process.GetProcesses(); 

然後你可以,如果你的程序運行檢查。

+0

但是當我運行該程序時,將始終存在一個具有該名稱的進程。如果我的程序被稱爲mailChecker,並且在那個程序中我檢查mailChecker是否打開,它將始終返回true,因爲如果mailChecker打開,mailChecker會觸發。或者我錯了? – Spliid

+0

您可以使用GetProcessesByName並查找mailChecker。如果已經運行,您會看到兩個條目,此時您的程序可以自行停止。 – Mant101

+0

對不起,延遲迴復。要麼@ Mant101說,並檢查進程的數量。或者使用'Process.GetCurrentProcess()'獲取當前進程並比較Id,如果它們與您正在查看當前程序進程的ID相同。 – MrApnea

相關問題