多线程问题,求大大帮忙
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,用线程+委托
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函数,切换线程。
[解决办法]