非UI线程访问控件
在VS2003之后的版本中,.NET加强了线程安全方面,非UI线程是不能直接访问控件的。这要求我们对控件进行线程安全方式的调用。当然,我们也可以这样做:
CheckForIllegalCrossThreadCalls = false
(这个属性包含在 System.Windows.Forms 中)
这样,VS就会忽略掉所有关于线程不安全调用的警告。这很方便,但是不是线程安全的。当同时有几个线程访问这个控件时,就会发生意想不到的错误,并不推荐这种解决办法。
MSDN上推荐用这样的方法进行线程安全的调用:
- 查询控件的 InvokeRequired 属性。
- 如果 InvokeRequired 返回 true,则使用实际调用控件的委托来调用 Invoke。
- 如果 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);
}
}