2012-05-09 157 views
3

我正在使用VOIP客戶端(窗口窗體)在打電話或收到呼叫時打開瀏覽器窗口(ExtendedWebBrowser)。通常它工作正常,但如果計算機進入休眠模式,然後喚醒程序將具有以下錯誤崩潰:由於線程位於單線程單元中,因此無法實例化ActiveX控件。從睡眠狀態喚醒PC後發生

"System.Threading.ThreadStateException crossed a native/managed boundary 
    Message=ActiveX control '8856f961-340a-11d0-a96b-00c04fd705a2' cannot be instantiated because the current thread is not in a single-threaded apartment." 

我已經嘗試設置線程的代碼開始thread.SetApartmentState(ApartmentState.STA)但我得到同樣的結果。另外,我在main()函數之前確實有[STAThread]。現在我想知道,如果它有更多的線程沒有正確終止,當電腦進入睡眠,但我不知道。我的背景是C++和DirectX,這是我工作過的第一個Windows窗體,所以任何幫助將不勝感激。

後續活動:在發現恢復程序在工作線程而不是主線程上啓動後,我能夠解決此問題。更多信息可以在這裏閱讀:Sleep(suspend) and Resuming windows form starts program on worker thread instead of main thread

+0

這通常是由您的程序啓動時出現問題引起的。刪除你所做的任何自定義splashscreen,並確保創建的第一個窗口在主線程上初始化。這確保了SystemEvents類被正確初始化。 –

+0

嗨漢斯,謝謝你的回覆。第一個創建的窗口在主線程上初始化。但是,第一個/主要形式不是那個錯誤。由主窗體打開的瀏覽器窗口是一個給我錯誤的窗口。另外,我相信重要的是要注意,錯誤只發生在計算機進入睡眠模式然後醒來之後。 OnPowerChange窗體關閉,恢復後窗體再次運行,就像它們在初始加載時一樣。 – madeFromCode

+0

那麼,不清楚,但瀏覽器肯定會產生這種錯誤。請注意您的問題標題是錯誤的,它會抱怨,因爲它不是在STA線程上創建的。不知道OnPowerChange可能是什麼,但跡象表明,無論您使用什麼事件都在錯誤的線程上運行,從而觸發投訴。 –

回答