非UI线程访问控件

非UI线程访问控件

在VS2003之后的版本中,.NET加强了线程安全方面,非UI线程是不能直接访问控件的。这要求我们对控件进行线程安全方式的调用。当然,我们也可以这样做: CheckForIllegalCrossThreadCalls = false (这个属性包含在 System.Windows.Forms 中) 这样,VS就会忽略掉所有关于线程不安全调用的警告。这很方便,但是不是线程安全的。当同时有几个线程访问这个控件时,就会发生意想不到的错误,并不推荐这种解决办法。 MSDN上推荐用这样的方法进行线程安全的调用:
  1. 查询控件的 InvokeRequired 属性。
  2. 如果 InvokeRequired 返回 true,则使用实际调用控件的委托来调用 Invoke。
  3. 如果 InvokeRequired 返回 false,则直接调用控件。
根据这样的方法,写出来的示例: public delegate void AddList(String s); private void Addlist(String s) { if (this.list.InvokeRequired) { AddList d = new AddList(Addlist); this.Invoke(d, new Object[] { s }); } else { this.list.Items.Add(s); } }
posted @ 2014-02-07 21:14  fuis  阅读(156)  评论(0编辑  收藏  举报