线程代码如下:
        private void doAsk()
        {
            string tmpData = "";
            while (true)
            {
                    if (lsv_List.Items.Count > 0)
                    {
                        for (int i = lsv_List.Items.Count - 1; i >= 0; i--)  
                        {
                           tmpData = lsv_List.Items[i].Text; //这句话报错:线程间操作无效: 
                                                             //从不是创建控件“lsv_ReaderList”的线程访问它。
                        }
                    }
                    else //则休眠100毫秒
                    {
                        Thread.Sleep(100);
                    }
            }
        }================================================
网上介绍跨线程为窗体控件赋值的文章很多,却没找到如何在线程中使用窗体控件数据的例子或说明,还请大家多多指教。
谢谢。

解决方案 »

  1.   

    使用委托
            public delegate void GetListDataHandler(Control list, int i);
            public GetListDataHandler getData;
            private strText=string.Empty;
            private void GetListData(Control list, int i)
            {
                strText = list.Items[i].Text;
            }在线程中调用:this.BeginInvoke(this.getData, new object[] { lsv_List, i});随便写的,应该可行。 自己再优化下。 
      

  2.   

    在调用线程之前还要加一句:
    getData = GetListData;
      

  3.   

    delegate void InvokeDelegate()
     private void doAsk() 
    {         InvokeDelegate beginProcess = delegate()
               {
                   你要访问数据的语句
               };
                this.Invoke(beginProcess);
    }
      

  4.   

    其他线程访问主线程的资源时,需要使用委托,例如:
    在线程中更新主线程中的Label1的Text:private delegate void SetTextHandler(string text);private void setTextInner(string text)
    {
        Label1.Text = text;
    }private void setText(string text)
    {
        if(InvokeRequired)
        {
            SetTextHandler sth = setTextInner;
            Invoke(sth,new object[]{text});
        }
        else
        {
            setTextInner(text);
        }    
    }那么你在其他线程中修改Label1的文本时,调用setText就可以了,而如果你直接调用setTextInner是不能直接更新Label1的,不同线程就好比不同房间,你在书房是不能直接操作客厅的东西的,你首先要在客厅提供一个代理,在书房使用这个代理,注册一个入口,然后才可以直接操作。
      

  5.   

    对,必须使用委托,或者把不安全跨线程访问设置成false