跨线程访问窗体控件

访问 Windows 窗体控件本质上不是线程安全的。如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。还可能出现其他与线程相关的 bug,包括争用情况和死锁。确保以线程安全方式访问控件非常重要。

怎样才算安全?

在给控件赋值或设置前,先看看方法调用时是否必须调用 Invoke 方法。

Windows 窗体中的控件被绑定到特定的线程,不具备线程安全性。因此,如果从另一个线程调用控件的方法,那么必须使用控件的一个 Invoke 方法来将调用封送到适当的线程。该属性可用于确定是否必须调用 Invoke 方法,当不知道什么线程拥有控件时这很有用。

//委托
delegate void SetEnableCallback(System.Windows.Forms.Control objCtrl, bool enable);
//声明
private void _SetText<TObject>(TObject objCtrl, string text)
where TObject : System.Windows.Forms.Control
{
  if (objCtrl.InvokeRequired)
  {
    SetTextCallback d = new SetTextCallback(_SetText);
    this.Invoke(d, new object[] { objCtrl, text });
  }
  else
  {
    objCtrl.Text = text;
  }
}
//调用
public int TotalNum
{
set { _SetText<TextBox>(this.txt_Total, value.ToString()); }
}
posted @ 2013-04-20 16:47  Charles_Lv  阅读(881)  评论(2编辑  收藏  举报