从后台线程更新时,为什么UI组件没有刷新?

时间:2010-04-16 18:06:30

标签: c# .net winforms

我有一个winform,其中包含一些在事件处理程序中更新的按钮。该事件从后台线程触发,然后通过Invoke方法设置外观。这些按钮将被启用或禁用。不过,在不可预测的时候会发生一些事情:

  • 按钮不会直观地改变外观。应该启用它时,它看起来仍然是禁用的
  • 点击“已停用”按钮仍会触发点击事件 - 就好像它实际启用了
  • 一样
  • 调整表单大小或移动表单后,组件的外观已正确设置为启用。
  • 只有以这种方式更新的组件才会受到影响。表单上的其他组件看起来很好。

以下是按钮在代码中的更新方式:

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 个答案:

答案 0 :(得分:2)

尝试致电

System.Windows.Forms.Application.DoEvents()
更改按钮的启用属性