首頁>Program>source

我一直被可怕的OnUserPreferenceChanged Hang困扰,這是Ivan Krivyakov很好地引用的,這裏:

http://ikriv.com/en/prog/info /dotnet/MysteriousHang.html#BeginInvokeDance

当我最初遇到問题時,我不久前發佈了一个問题:

還有另一个C#死鎖除錯問题

我以為我已经解決了它,方法是删除从UI執行緒構建的控制元件,但是過了一会儿它又出現了(可能再也没有出現……)。

我们一直在使用.NET 3.5,据我了解,它使用CLR 2.0.最近,该應用程式已升級為使用.NET 4.0客戶端配置檔案/ CLR 4.0.此外,我们已经从Infragistics winForms 10.1升級到了10.3.唯一的不同是以前的版本被混淆了...有人在混淆和掛起時遇到過問题吗?

我曾经一劳永逸地删除了所有掛起的應用程式,但不尋常的是,我無法在最新版本(使用.NET 4.0)中重現掛起.使用Ivan Krivyakov的方便的Freezer應用程式(請參阅他的文章),可以很容易地在以前的版本(使用.NET 3.5)中重現该掛起,该應用程式会根据請求觸發wM_SETTINGCHANGE訊息。

這个問题可能会自動消失,這让我有些希望,但是没有人知道CLR是否从2.0更改為4.0会匯致此問题吗?

-----------------------------------------------------SOLUTION--------------------------------------------------

因此,在測試了應用程式的各種變化之後,例如 CLR 2.0 + Infragistics 2010.1,CLR 2.0 + Infragistics 2010.3和CLR 4.0 + Infragistics 2010.1,我们认為我们已经確定問题是winForms 2010.1中Infragistics元件的問题(無修補程式).我们仍然没有使用CLR 2.0或帶有Infragistics 2010.3的CLR 4.0来複製冻結(並且我们現在非常擅长複製此冻結...)。

最新回復
  • 5月前
    1 #

    a Control that was constructed off the UI thread...

    是的,這是觸發此問题的好方法.潜在的問题是由SystemEvents類引起的,它具有令人羡慕的任務:在正確的執行緒上引發其事件. UserPreferenceChanged事件是典型的麻煩製造者,许多控制元件都订阅了该事件,因此当使用者更改桌面主题時它们可以重新绘製自身.元件供應商不会忽略此需求.工具箱中也没有標準的.NET框架控制元件。

    測試此問题的一種通常不錯的方法是鎖定工作站(按win + L键),這也是通常在使用者計算機上觸發死鎖的方式.切換到安全桌面倾向於觸發事件.伴隨着其他怪癖,当您除錯程式時,這永远不会發生,並且它具有与時間相關的棘手行為,因為当没有人在機器上時,這往往会發生.尤其难以除錯。

    遇到這種麻煩的一種標準方法是由於程式中的初始化問题.订阅的第一个SystemEvents事件匯致SystemEvents類初始化自身並設置接收這些通知並引發其相應事件所需的管道.一个自定義啟動螢幕執行了太多操作(即,不仅仅是顯示位圖),並且在標記為STA的工作執行緒上執行足以解決此問题.像ProgressBar這樣簡單的东西就足够了. SystemEvents假定工作執行緒是程式的主執行緒,現在可以在將来轻松地在錯誤的執行緒上生成事件.有一个很好的诊斷方法,如果该工作執行緒不再存在,則將生成優先機会異常.您可以在"輸出"視窗中看到它。

    或者您建立另一个UI執行緒並在两个執行緒上都有表單.不可避免地,這些形式之一总是会在錯誤的執行緒上获取事件。

    唯一的體面建議是承认在工作執行緒上建立UI是火箭科學,微软也不知道如何正確地做.值得註意的是,.NET 1.x控制元件具有事件處理程式,当从錯誤的執行緒呼叫它時,该事件處理程式仍然可以正常工作,它仅呼叫Control.Invalidate().但這是在2.0時代似乎已经失去的知識,ToolStrip是一个很好的例子.並且不要相信元件供應商会正確地做到這一點,特別是Infragistics並没有出色的声誉.不要這樣做。

  • 5月前
    2 #

    我找到了解決此問题的最佳指南:

      Debugging Windows Forms Application Hangs During SystemEvents.UserPreferenceChanged - The DSUI Team Blog - Site Home - MSDN Blogs

    它將逐步指匯您使用winDbg驗證錯誤的原因,並向您展示如何查詢匯致该錯誤的原因.正如您提到的,很可能是在非ui執行緒上建立了控制元件。

    對於我而言,我通過建立一个工厂来解決该問题,该工厂使用UI執行緒中的SynchronizationContext来建立控制元件,然後呼叫CreateControl()以強製建立UI控制代碼。

    Microsoft支援文章在這裏:

      Windows Forms application freezes when system settings are changed or the workstation is locked

    p

    如果您从他的網頁先執行CLR 2.0然後執行CLR 4.0的示例應用程式,那麼您会發現問题似乎確實在4.0中消失了-不知道發生了什麼變化,但是也许他们確實解決了该問题 . BR

  • 使用cron安排R指令碼
  • php 5.2:PHP 52的DateTime :: diff()可以使用什麼?