解决方案 »

  1.   

    pl.table只有一个实例,它绑定到dataGridView上后,工作线程还在向pl.table添加行。而dataGridView同时还要从里面读数据显示。这样多线程访问非线程安全的对象,就造成了你看到了不稳定的现象。应该是读数据操作的对象和UI绑定的对象分离,读出一部分数据后,BeginInvoke到UI线程把它们添加进绑定的数据。
      

  2.   

    this.BeginInvoke(new InvokeHandler(p => { this.dataGridView1.DataSource = pl.table; }), pl);
    改为:
    this.Invoke(new InvokeHandler(p => { this.dataGridView1.DataSource = pl.table; }), pl);
    或者使用WPF,使用通知形式让界面自动更改。
      

  3.   

    别把后台填充数据的DataTable直接用来绑定
    你可以试试加个中间层BindingSource
      

  4.   


    第一,滥用阻塞式线程逻辑(循环里边启动一堆线程,你的程序的复杂性和bug程指数放大了),你得程序中不应该有while 循环语句。第二,定是获取数据,不要搞什么“5毫秒刷新”这种逻辑。有数据、得到事件/消息通知之后才去读数据,而不是轮询。
      

  5.   

    定是获取数据,不要搞什么“5毫秒刷新”这种逻辑-->  定是获取数据,不要搞什么“5毫秒刷新”这种重复刷新逻辑而且就算是你把定时器的Interval时间从 5ms 改为 500ms,也仍然应该尽量避免使用定时器。
      

  6.   

    在你的程序中,你使用了datatable。那么这里                while (fl < tl)
                    {
                        pl = GuiDao.ListSectioned(businessClazz, pl);
                        Thread.Sleep(5);
                        listSectionedCallback(true, pl, "调用GuiDao失败");
                        DispMsg(true, pl.table.Rows.Count, "读取失败");
                    }每一次绑定数据时都不得不创建一个新的、线程安全的 pl.Table,而丢弃原来的 table。但是你弄一个“5毫秒之后”就整个刷新一遍控件显示的逻辑,这就会让程序根本无法继续设计下去。轮询,而且5毫秒去轮询数据源,这只会让一个程序上线时刻就是产品死掉的时刻。
      

  7.   


    获取数据的方式不是重点,也不是要做成定时,只是要分段加载大量数据的效果,具体看上头怎么设计,设置个Sleep是方便看异步的效果