代码如下:
       private void tsbImport_Click(object sender, EventArgs e)
        {
            this._importThread = new Thread(new ThreadStart(readItem));
            this._importThread.Start();
        }        private void readItem()
        {
            foreach (ListViewItem item in this.lvwFiles.Items)//异常地方
            {
             //...
            }
        }运行后,出现异常提示“线程间操作无效:从不是创建控件lvwFiles线程访问它”。
如何解决,请各位帮修改代码,多谢!

解决方案 »

  1.   

    private void readItem()
            {
                foreach (ListViewItem item in this.lvwFiles.Items)//异常地方
                {
                 Read(item);
                }
            }
    private delegate void ReadDelegate(ListViewItem item);private void Read(ListViewItem item)
    {
         if (item.InvokeRequest)
    {
         item.Invoke(new ReadDelegate(Read), new object[] {item};
    }
    else
    {
    // read here.
    }
    }
      

  2.   

    楼上的多谢了。
    线程启动后,在
    foreach (ListViewItem item in this.lvwFiles.Items) 就出现异常了,根本无法执行到Read(item)。
      

  3.   

    li01bin(啊!斌) 你的是不是2003他的肯定是2005
      
    *****************************************************************************
    欢迎使用CSDN论坛阅读器 : CSDN Reader(附全部源代码) 
    http://www.cnblogs.com/feiyun0112/archive/2006/09/20/509783.html
      

  4.   

    private void readItem()
            {
                 Read(); 
                        }
    private delegate void ReadDelegate();private void Read()
    {
    foreach (ListViewItem item in this.lvwFiles.Items)//异常地方
                {
         if (item.InvokeRequest)
    {
         item.Invoke(new ReadDelegate(Read), new object[] {item};
    }
    else
    {
    // read here.
    }
    }
    }
    不知这样行吗?
      

  5.   

    在构造函数中增加一句
    CheckForIllegalCrossThreadCalls = false;
    就行了
      

  6.   

    在构造函数中增加一句
    CheckForIllegalCrossThreadCalls = false;
    就行了请问这个属性主要起什么作用?
      

  7.   

    在构造函数中增加一句
    CheckForIllegalCrossThreadCalls = false;
    就行了请问这个属性主要起什么作用?
    ------------------------------------------
    以2003的方式运行线程
      

  8.   

    vs2005要简单些,直接调用匿名方法
    vs2003要先定义delegate
      

  9.   

    本人测试了,加入CheckForIllegalCrossThreadCalls = false;这句的确可以!
      

  10.   

    control.invoke()
    用这个方法吧,保证没问题的~~
    xiehuanxie才是完美的~
      

  11.   

    在.net中不能直接在UI Control的创建线程之外修改UI Control的属性和内容。一个基本办法是通过调用UIControl 的Invoke方法。考虑一个简单的例子:我们希望在一个通过btnStart启动的线程A中,每隔10秒把txtTime的Text属性更新为:线程A的线程名+线程A传入的“当前时间”。 下面是主要代码private void btnStart_Click(object sender, System.EventArgs e)
    {
     Thread th = new Thread(new ThreadStart(WorkThreadMethod));
     th.Name = "TH" + i;
     th.Start();
    }public delegate void UpdateTextCallback(string threadName, DateTime time);private void WorkThreadMethod()
    {
     Thread.Sleep(10000);
     txtTime.Invoke(new UpdateTextCallback(this.UpdateText), new object[]{Thread.CurrentThread.Name, DateTime.Now});
    }private void UpdateText(string threadName, DateTime)
    {
      txtTime.Text = threadName + time.ToString();
    }
    欢迎大家来我的博客作客:http://blog.csdn.net/aafshzj/
    我正在写一系列关于AAF组件框架的文章。该框架能对开发工作提供很多帮助,并极大地提高开发效率。希望大家看一看并提出宝贵建议。
      

  12.   

    必须使用Control.Invoke或Control.BeginInvoke方式来异步操作。
    通过多线程为基于 .NET 的应用程序实现响应迅速的用户
    http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/misMultithreading.mspx
    为Windows应用创建简单的异步调用模式
    http://www.microsoft.com/china/MSDN/library/architecture/AsynCallPattern.mspx
      

  13.   

            private delegate ListViewItem PhoneListItemReadDelegate(int index);
            public ListViewItem getlv系统设置PhoneListItem(int index)
            {
                if (lv系统设置PhoneList.InvokeRequired)
                {
                    PhoneListItemReadDelegate d = new PhoneListItemReadDelegate(getlv系统设置PhoneListItem);
                    return (ListViewItem)(this.Invoke(d, new object[] { index }));
                }
                else
                {
                    if (index < 0)
                    {
                        return null;
                    }
                    if (index < this.lv系统设置PhoneList.Items.Count)
                    {
                        return this.lv系统设置PhoneList.Items[index];
                    }
                    else
                    {
                        return null;
                    }
                }
            }
      

  14.   

    private delegate ListViewItem PhoneListItemReadDelegate(int index);