2014-01-09 58 views
0

我目前正在開發一個帶有c#和.net框架4.5的windows服務來擴展現有專有應用程序的功能,這個服務在EventWaitHandleClass(msdn link)上等待從主應用程序發出的命名事件。事情是這樣的:使用EventWaitHandle等待命名事件的Windows服務問題。

bool boolWithFalse = false; 
string eName = "notification_event"; 
string usr = Environment.UserDomainName + "\\" + Environment.UserName; 
EventWaitHandleSecurity security = new EventWaitHandleSecurity(); //* 
EventWaitHandleAccessRule rule = new EventWaitHandleAccessRule(usr, EventWaitHandleRights.Synchronize, AccessControlType.Allow); 
security.AddAccessRule(rule); 
EventWaitHandle handle = new EventWaitHandle(false, EventResetMode.ManualReset, eName, out boolWithFalse, security); 

//... some non relevant code lines here 

//This is where the it locks waiting for the named event 
var w = EventWaitHandle.WaitAny(new[] { handle }, Timeout.Infinite); 

*:EventWaitHandleSecurity MSDN

現在,這就像如果我執行我的程序作爲控制檯應用程序,我可以很容易地從主應用程序趕上事件和處理它們,因爲我打算魅力,但是,當我將應用程序安裝爲服務時,它會鎖定等待這個相同的命名事件,但從未收到信號。該服務設置爲使用NT AUTHORITY \ LOCALSERVICE帳戶運行,我已經嘗試使用我自己的帳戶(程序運行時用作控制檯應用程序),但沒有任何反應。

如果它有助於發起信號的應用程序在我自己的帳戶下運行。我非常感謝任何幫助,因爲我是一個爲Windows開發桌面應用程序的完整初學者。

+0

歡迎來到堆棧溢出,我已編輯您的問題,請參閱http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles –

+0

好的,謝謝。 – George181716

回答

1

你迷失在安全喧鬧中。兩個問題。第一個是某人必須創建事件,其他人必須打開它,以便兩個組件共享相同的事件對象。其中一個必須使用EventWaitHandle構造函數,另一個必須調用EventWaitHandle.OpenExisting()方法。正常的方式是服務創建事件並讓UI程序打開它。

下一個問題是事件對象的可見性。 Windows爲指定的操作系統對象實現名稱空間,這與您在C#語言中使用名稱空間的方式非常相似。根名稱空間由會話命名。並且服務在與用戶的桌面程序不同的會話中運行。要讓桌面會話程序查看在服務會話中創建的事件,您必須使用「全局」事件名稱。看起來像這樣:

string eName = "Global\\notification_event"; 

請注意如何命名全局可見的命名事件。有一天某處有另一位程序員認爲「notification_event」是名字的不錯選擇。你不想見他。 {guid}是個好名字,你可以從Tools + Create GUID中獲得一個。它在已知的宇宙中是獨一無二的,可能超越。

+0

這很有趣,問題是我試圖完成相反的事情,從服務中看到在當前會話中創建的對象,並且無法以任何方式修改桌面程序,我必須找到一種方法去做這個。並感謝作爲名稱建議的guid,代碼示例中使用的名稱已組成,我打算給出我的代碼的一個虛擬示例=)。無論如何,我會繼續挖掘主題,看看我能找到什麼,感謝指導方針,希望我能投票。 – George181716