當我使用Visual Studio運行我的應用程序時,我總是得到DisconnectedContext(託管調試助手)。鑑於谷歌和文檔,這可能發生在STA上的COM對象從其他線程調用。在Visual Studio中解決DisconnectedContext
但是,當我查看所有線程彈出窗口時,我沒有發現任何這樣的事情。 (我根本沒有發現任何奇怪的東西)。
關於如何找到DisconnectedContext方法的一些想法?
當我使用Visual Studio運行我的應用程序時,我總是得到DisconnectedContext(託管調試助手)。鑑於谷歌和文檔,這可能發生在STA上的COM對象從其他線程調用。在Visual Studio中解決DisconnectedContext
但是,當我查看所有線程彈出窗口時,我沒有發現任何這樣的事情。 (我根本沒有發現任何奇怪的東西)。
關於如何找到DisconnectedContext方法的一些想法?
這是一個非常嚴重的警告,不要忽視它。該方案是您在線程上創建了一個COM對象,並且該線程已退出。但是你繼續使用這個對象。 COM負責管理那些宣稱自己不是線程安全的對象(又稱公寓線程),它會自動將該對象上的任何調用匯集到創建它的線程。當那個線程不再存在時,這是行不通的。
忽略警告可能會偶爾產生並且很難排除線程競爭錯誤。每星期只發生一次錯誤的東西。檢查你的代碼,注意它所抱怨的對象是如何創建的。
發現這個在尋找相同的答案,以爲我會添加評論...
此錯誤是使用CLR任何多線程應用程序幾乎不可避免的進程互操作對象通過(瞬態線程)。問題在於CLR對對象進行了非確定性清理(可能是RCW,對底層COM對象具有線程相關性)。您無法告訴運行時清理在線程上創建的對象(至少不會在線程上創建另一個非確定性清理句柄);這是互操作機制的設計侷限性。鑑於此,沒有辦法永遠安全地退出創建任何CLR對象的線程,而不會發生此錯誤。
最佳建議:如果您可以提供幫助,請不要使用CLR/interop。接下來最好的建議是:使用COM +來處理隔離你的互操作,所以CLR可以存在於一個永不終止線程的進程中(使用持久化線程池或等價的)。接下來的最佳建議是:與我一起繼續向Microsoft通報他們互操作的設計級問題,並希望他們能夠解決這個問題。
我不想忽略警告(用CTRL + ALT + E刪除它會做詭計)。問題是,我不知道應該看哪裏,因爲應用程序是巨大的,警告不會告訴我爲什麼它是觸發的。 – Toto 2011-02-01 10:41:31