子线程访问主线程下的控件报错的解决办法
子线程如果要直接访问主线程下的控件,在调试模式下运行是会报错的,提示大致如下:
线程间操作无效: 从不是创建控件“XXXX” 的线程访问它。
解决办法,委托(代理)解决:
假设子线程是想往listview1控件上绑定数据:
第一步:
public delegate void SafeBind(ListViewItem lvi);//跨线程访问控件的委托
SafeBind safebind;
第二步:
public void BindListView(string title, string content)
{
ListViewItem lvi = new ListViewItem(DateTime.Now.ToString());
lvi.SubItems.AddRange(new string[] { title,content});
SafeInsetItem(lvi);//执行安全绑定方法
}
第三步:
private void SafeInsetItem(ListViewItem lvi)
{
if (this.listView1.InvokeRequired) //返回true表示调用线程与控件创建线程不同
{
safebind = new SafeBind(SafeInsetItem);
this.Invoke(safebind,lvi); //执行带参数的委托
}
else
{
this.listView1.Items.Add(lvi);
}
}
以上代码的实质是子线程调用了主线程下的委托,委托又执行了绑定方法。
不用委托为什么会报错呢?——微软的安全访问机制(多个线程访问同一组件是不安全的)
参考网址:http://zhidao.baidu.com/question/14949954.html?an=0&si=5