问题描述
- 初次使用Task<TResult>关于阻塞主线程求指教
-
做了一个winform程序,点击一个按钮需要调用一个复杂耗时的方法,总是造成主界面卡死,据说Task可以解决此类情况,就上网查资料模仿,后来发现还是卡死,代码段如下:
City ct = (City)cbxCity.SelectedItem;
bool checkCom = cBoxDisCom.Checked;
Task t = null;
t = new Task(() => ImportService.FilterForRaw2(dt, ct, checkCom));
t.Start();
t.Wait();
dgvExportData.DataSource = t.Result.Tables[1];
dgv1.DataSource = t.Result.Tables[0];
请问有没有办法可以既获取Task产生的结果t.Result,又不会造成主线程阻塞
解决方案
ImportService.FilterForRaw2中不能有同步界面UI并且耗时的代码
不能有t.Wait,否则还是会阻塞界面。
解决方案二:
那就不要wait,自己开一个线程,线程中做完事情,委托通知UI
解决方案三:
BackgroundWorker backgroundWorker1 = new BackgroundWorker();
backgroundWorker1.WorkerReportsProgress = true;
private void btnStart_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWokerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkeventArgs e)
{
for (int i = 1; i < 11; i++)
{
Thread.Sleep(2000);
backgroundWorker1.ReportProgress(i*10);
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//progressBar1是ProgressBar控件
progressBar1.Value = e.ProgressPercentage;
}
时间: 2024-12-26 10:48:09