多线程问题,求大大帮忙
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函数,切换线程。
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------