2013-01-22 85 views
1

幾天前,我開始變得與C#WinForm應用程序錯誤我已經創建,指出處理執行的進程

的CLR一直無法從COM上下文0x278f58轉換爲COM上下文0x2790c8持續60秒。擁有目標上下文/公寓 的線程很可能是在不抽取Windows消息的情況下執行非抽取等待或處理非常長的運行操作。

當我使用單獨的線程運行exe進程以避免凍結ui時,發生這種情況。在發佈版本,這個程序運行良好,如預期,但幾乎無法一致地調試我的程序(有時工作正常,其他不太好)

我已經試過實施這個過程迫使BackgroundWorker使用多個Google搜索結果同步解決這個錯誤的問題,但使我的程序以意想不到的方式工作(文本框在exe結束之前填充導致錯誤的數據)。

我讀過這個錯誤只會發生在生產中,而不是在發佈..所以我的問題是我應該只是試圖忍受這種煩惱或是他們的非背景解決方案?如果需要任何代碼示例,我可以提供,但我不相信這是必要的

+1

這是一個調試器警告。沒有調試器,你不會得到它。雖然肯定會有一些可能會從用戶那裏得到*完全相同的投訴。他們不會明白爲什麼你的UI會凍結,或者爲什麼程序不能停止,並且不會響應輸入。 –

回答

1

受管調試助手(MDA)告訴你單線程單元(STA)COM線程沒有響應消息在60秒內。 STA COM通過消息傳遞完成。如果打開MDA,則會發生此異常,在調試器下運行時默認爲此。 MDA可以用預先定義的超時檢測死鎖,並且只有在VS調試器下運行程序時纔有效。

由於許多COM組件都是STA,並且Windows窗體中的主線程也是STA,所以這是一個警告,表明您正在阻止。這可能是因爲你花費時間逐步瀏覽代碼來拖延消息循環。

要爲單個項目關掉這個功能,下面的內容添加到您的應用程序配置文件:

<mdaConfig> 
    <assistants> 
    <contextSwitchDeadlock enable="false" /> 
    </assistants> 
</mdaConfig> 

要全局關掉這個功能:

  • 點擊調試菜單上視覺工作室。
  • 選擇例外選項(調試 - >例外)。
  • 「例外」窗口將打開。
  • 展開「Managed Debugging Assistants」節點。
  • 取消選中ContextSwitchDeadlock選項下的引發列。
  • 單擊確定並關閉例外窗口。

禁用此MDA的含義是,在釋放應用程序之前,您失去了發現錯誤的有用工具。當然,如果你在調試器下運行時看到這個死鎖,那麼你需要做一個正常的死鎖分析。

+0

感謝這個有用的見解..我認爲對於我的特殊情況,我將盡可能多地解決這個問題,儘可能地儘量減少實際死鎖的風險。 – Sayse