2010-04-16 100 views
1

我有一個在事件處理程序中更新的一些按鈕的winform。該事件是從後臺線程觸發的,然後通過Invoke方法設置外觀。這些按鈕將被啓用或禁用。但是,在不可預知的時間會發生:爲什麼從後臺線程更新時不刷新UI組件?

  • 該按鈕不會在視覺上改變外觀。當它應該被啓用,它仍然看起來像被禁用
  • 點擊「禁用」按鈕仍會觸發點擊事件 - 好像它實際上啓用在下面
  • 調整大小或移動窗體後,組件的外觀設置正確啓用。
  • 只有以這種方式更新的組件纔會受到影響。表單上的其他組件外觀/行爲良好。

這裏是如何的按鈕在代碼中得到更新:

public class Form1 :Form 
{ 
    void eventFromThread(object sender, CustomEventArgs e) 
    { 
      if(e.enable) RunOnUiThread(ShowEnabledView); 
      else RunOnUiThread(ShowDisabledView); 
    } 

    void ShowEnabledView() 
    { 
      button1.Enabled = true; 
    } 

    void ShowDisabledView() 
    { 
      button1.Enabled = false; 
    } 

    void RunOnUiThread(MethodInvoker method) 
    { 
      try 
      { 
       if(InvokeRequired) 
       { 
        Invoke(method); 
       } 
       else 
        method.Invoke(); 
      } 
      catch(ObjectDisposedException) 
      { return;} 
      catch(InvalidOperationException) 
      {return;} 
    } 
} 

我試圖強制刷新按鈕,現在也沒有再發生,但其只去過一些日子。這個問題似乎在它想要的時候彈出,所以我不能確定我正在修復任何東西。任何人都可以對此有所瞭解嗎?

+1

刪除try/catch塊後,它被隱藏的錯誤。 – 2010-04-16 20:15:33

回答

2

嘗試調用

System.Windows.Forms.Application.DoEvents() 

更改按鈕的Enabled屬性

+0

DoEvents如何提供幫助?如果按鈕已啓用,那麼現在不應該重新繪製? – 2010-04-16 18:35:22

+0

@ [R.B。]:理想情況下應該,但DoEvents強制GUI線程立即處理。您描述的症狀表明GUI線程處理正在推遲。你試過了嗎? – 2010-04-18 14:39:39

+0

我已經添加了DoEvents,希望它能夠將問題嚇跑。 GUI處理有可能延遲幾天?我已經看到這種情況發生在用戶界面應該在週五更新組件的情況下,該程序在週末無人看管,並且週一按鈕仍然被視覺禁用。 – 2010-04-19 13:54:58