我的程序是一个主窗口负责界面操作,一个主要的工作类TaskServer(它是单件模式的)主界面负责启停TaskServer的工作,并且用一个DataGridView控件显示TaskServer中存放的一个BindingList。数据绑定,我是直接在主窗口的构造函数中写:dataGrid.DataSource = TaskServer.DataList;然后,在TaskServer中也开了若干线程,其中一个是往DataList里面添加东西的。我一旦添加东西,就捕获到异常:“线程间操作无效: 从不是创建控件“dataGrid”的线程访问它。”数据绑定不是原本就是可以安全地跨线程的吗?为什么这里却不给我用?

解决方案 »

  1.   

    跨线程了。WINFORM 用委托。
    WPF用 Dispictor
      

  2.   

    http://www.2cto.com/kf/201206/136587.html
      

  3.   

    用lock,添加数据的时候加锁。
    private object lockobj = new object();lock(lockobj){
    //绑定数据。
    }
      

  4.   

    lock了也是同样的结果。我私下里在添加数据的时候lock,C#根本不承认。
      

  5.   

    然后,在TaskServer中也开了若干线程,其中一个是往DataList里面添加东西的。
    -->你这个线程里面添加东西的操作应该调用主窗口的Invoke吧
      

  6.   


    如果还要把主窗口的Invoke传到这里来,那设计不就乱了吗
      

  7.   

    dataGrid中不要直接绑定TaskServer.DataList,安全的话,界面中维护一个自己的DataList,界面中用一个方法把TaskServer.DataList复制到界面自己的DataList,然后再绑定,这个方法用委托调用就可以用于多线程了,
      

  8.   


    试了一下,这是个解决方法,不过还是不够完美。不断地把界面上的list清空然后重新复制入原list的内容,这样一来界面的datagrid会不断重新清空后重新载入。用户在里面滚定查看内容都成为很困难的一件事情。不知道还有啥改进方法没。