2012-08-14 13 views
3

我有一個生成新線程,如下的方法:我現在得到Access denied (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))異常從COM互操作我想啓動一個線程與同在C#.NET父安全上下文

Thread thread = new Thread(() => ClassObject.SetXY(var1, var2)); 
thread.SetApartmentState(ApartmentState.STA);    
thread.Start(); 
thread.Join(); 

。 當我在同一父線程中運行該函數時,我沒有得到該異常。但是,我需要它在單獨的線程中運行以將公寓狀態設置爲STA。我目前正在運行我的代碼作爲Windows服務,甚至當我在主要方法上使用[STAThread]時,我沒有得到這個工作。

簡單地說,我需要什麼:

  • 1-無論是啓動一個線程(STA)像上面具有相同的安全 上下文父線程。

  • 2 - 不啓動一個新線程(這將解決訪問被拒絕的問題,但 將拋出一個異常,由於線程的單元狀態不 是STA),但使Windows服務運行的線程在STA 公寓狀態。

感謝

+0

嘗試使用線程池確實副本調用者的安全上下文。 – user629926 2012-08-14 23:30:49

+0

@ user629926:之前沒有使用過,可以顯示一些代碼,我可以如何使用threadpool來做上面的代碼? – 2012-08-14 23:33:19

+0

我發現它使用內部的ExecutionxContext嘗試調查。我的意思是隻調用ThreadPoll.QueieUserWorkItem而不是創建新線程。 – user629926 2012-08-14 23:46:52

回答

0

你可以複製父線程的執行上下文,然後在產生的線程上上下文中運行代碼:

var executionContext = ExecutionContext.Capture(); 
Thread thread = new Thread(state => { 
    ExecutionContext parentContext = (ExecutionContext)state; 
    ExecutionContext.Run(parentContext, _ => { 
     ClassObject.SetXY(var1, var2); 
    }, null); 
}); 

thread.Start(executionContext); 
+0

我仍然使用這個解決方案'E_ACCESSDENIED'。 – 2012-08-15 18:12:33