2010-04-16 189 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