日期:2014-05-18  浏览次数:20994 次

多线程问题,求大大帮忙
c#winform程序,datagridview的数据源来自一个DataTable,但获取DataTable需要一定的时间,使用单线程的话,获取得DataTable后再显示到datagridview,会大大的降低用户体验。现在考虑使用多线程,用一个线程T1去获取DataTable,主线程sleep 1秒左右,再去读取DataTable,DataTable由T1动态更新。求大神解惑,这种方法可行吗?如果可行,如何实现?有例子更好。非常感谢。

------解决方案--------------------
主线程不能sleep,不然就白多线程了。
sleep使得线程挂起,如果是主线程挂起,那么程序就假死了。
------解决方案--------------------
主线程不要sleep,不然和没多线程没什么区别,照样会导致用户界面无响应
多线程更新用户界面的例子可以看这里
http://blog.csdn.net/niewq/article/details/5607821

------解决方案--------------------
其实用后台线程控件BackgroundWorker还是挺方便的。
------解决方案--------------------
不可行,sleep 1秒,你能保证任务完成吗,线程中加载完再操作grid,用线程+委托
C# code

        DataSet ds = new DataSet(); //全局dataset
        public delegate void GetData();
        private void BindData()
        {
            if (dataGridView1.InvokeRequired) //如果是线程中访问的
            {
                this.BeginInvoke(new GetData(BindData));
                return;
            }
            dataGridView1.DataSource = ds.Tables["stuff"];
        }
        private void Foo()
        {
            OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data source=c:\\txl.mdb");
            con.Open();
            string sql = "select * from stuff";
            OleDbDataAdapter da = new OleDbDataAdapter(sql, con);
            ds = new DataSet();
            da.Fill(ds, "stuff");//填充到ds
            BindData();//执行绑定
        }
        private void button8_Click(object sender, EventArgs e)
        {
//创建线程,并执行Foo
            Thread th = new Thread(new ThreadStart(Foo));
            th.Start();
        }

------解决方案--------------------
这个不需要另外开线程吧
不是有BeginXXXX之类的异步方法吗
------解决方案--------------------
用委托的beginInvoke 避免管理线程
--需要注意 UI元素 需要在主线程才能操作,DataTable查询完成后需要调用Form上的Invoke函数,切换线程。

  

------解决方案--------------------
探讨
c#winform程序,datagridview的数据源来自一个DataTable,但获取DataTable需要一定的时间,使用单线程的话,获取得DataTable后再显示到datagridview,会大大的降低用户体验。现在考虑使用多线程,用一个线程T1去获取DataTable,主线程sleep 1秒左右,再去读取DataTable,DataTable由T1动态更新。求大神解惑,这种方法可行吗?……

------解决方案--------------------
探讨
引用:
恩,这是一个方法,读取一部分数据后,绑定下datagridview的数据源,然后继续读取,就是不知道第二次对datagridview的数据源绑定的时候,会不会导致datagridview的刷新?

引用:
引用:
我之前的想法是,datagridview是按需显示的,用户拖动到什么位置,就动态显示到什么位置,在CellValu……

------解决方案--------------------
探讨
代码太长,datatable是从二进制文件中经过一定的解码转换读取的,数据量巨大,有可能达到上千列和上万行,所以这个datatable的读取时间也很长,只能使用datagridview的虚模式,否则读取到datatable后再绑定到datagridview的时间也有点长,用了虚模式几乎看不到数据的加载时间。

引用:
引用:
引用:
……