在主窗体下创建一个listview控件,有一个线程定时刷新listview的数据,可是会提示“线程间无效操作:不是创建控件“lvUsers”的线程访问它。”的错误!
在2003下没有问题换成2005后才出现的这个问题。
我得解决办法是,线程不在操作listview控件,而是把数据加入一个arraylist里,用timer控件定数刷新listview里的数据,有没有比这个更好的方法

解决方案 »

  1.   

    你用的肯定是VS2005
    VS2005对跨线程访问UI控件做了安全性保护策略.你所要做的,是在这一策略下,使用委托的方法,使UI线程自己去更新ListView(当然更新的处理逻辑还是在子线程里面做)
      

  2.   

    ListView.CheckForIllegalCrossThreadCalls = false;
      

  3.   

    或者使用后台线程,好像叫WorkerThread查查吧
      

  4.   

    你要用一个Delegate来调用你的方法.可以通过Control.InvokeRequired 属性 来查看是否是其它的线程对控件的访问..NET Framework 类库  
    Control.InvokeRequired 属性  
    获取一个值,该值指示调用方在对控件进行方法调用时是否必须调用 Invoke 方法,因为调用方位于创建控件所在的线程以外的线程中。
      

  5.   

    比如如下的代码(参考):
    private delegate void InvokeMethod();internal void setListView()
    {
    if (this.InvokeRequired)
    {
    InvokeMethod _setListView = new InvokeMethod(this.setListView);
    this.Invoke(_setListView);
    return;
    }
    //....正常的操作
    }
      

  6.   

    加入该句:Control.CheckForIllegalCrossThreadCalls   =   False;
    取消线线程安全保护模式!
    这样就和2003一样了或者在VS2005中使用 BackgroundWorker 控件进行的线程安全调用
    在应用程序中实现多线程的首选方式是使用 BackgroundWorker 组件。BackgroundWorker 组件使用事件驱动模型实现多线程。辅助线程运行 DoWork 事件处理程序,创建控件的线程运行 ProgressChanged 和 RunWorkerCompleted 事件处理程序。注意不要从 DoWork 事件处理程序调用您的任何控件。
      

  7.   

    http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/misMultithreading.mspx?mfr=true