我目前正在使用 Tasks 填充我的 DataGridView
。起初,当我填写 dataTable
时,一切正常,但是当我继续到 UI 线程时,我的表单会短时间无响应。
如何避免这种无响应期?
if (bar == null)
{
bar = CNPR.Controls.Helper.GetWaitingBar(this);
this.Controls.Add(bar);
}
bar.Visible = true;
bar.BringToFront();
bar.StartWaiting();
panel1.Enabled = false;
rasteTableBindingSource.DataSource = null;
var t = Task.Factory.StartNew(() => rasteTableTableAdapter.FillBySearch(chapYarDataSet.rasteTable))
.ContinueWith(delegate
{
bar.StopWaiting();
bar.Visible = false;
panel1.Enabled = true;
rasteTableBindingSource.DataMember = chapYarDataSet.rasteTable.TableName;
rasteTableBindingSource.DataSource = chapYarDataSet;
}, TaskScheduler.FromCurrentSynchronizationContext());
最佳答案
您正在使用 StartNew
具有当前同步上下文的方法,因此它不是在线程池中运行,而是在您的用户界面上运行。您应该阅读@StephenCleary 的文章 StartNew is Dangerous以便更好地理解您的代码。
您应该使用 Run
拆分数据检索的逻辑,这应该在后台完成。方法,并在 ui 上下文中填充数据源:
var t = Task.Run(() => rasteTableTableAdapter.FillBySearch(chapYarDataSet.rasteTable))
.ContinueWith(delegate { /* UI logic here */ },
TaskScheduler.FromCurrentSynchronizationContext());
更新:如果您使用的是 .Net 4.0 并且不能使用 Run
方法,请使用此重载:
Task.Factory.StartNew({ /* Action here */ },
CancellationToken.None,
TaskCreationOptions.None,
TaskScheduler.Default);
另一篇很棒的文章是 Task.Run vs Task.Factory.StartNew
关于c# - 如何在我的表单停止响应的情况下填充数据 GridView ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40735245/