子线程访问主线程下的控件报错的解决办法

子线程如果要直接访问主线程下的控件,在调试模式下运行是会报错的,提示大致如下:

线程间操作无效: 从不是创建控件“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

              http://zhidao.baidu.com/question/112998876.html?an=0&si=8

              http://zhidao.baidu.com/question/70832540.html

posted @ 2011-03-16 17:07  Billy.rao  阅读(1618)  评论(0编辑  收藏  举报