gpt4 book ai didi

c# - 如何在我的表单停止响应的情况下填充数据 GridView ?

转载 作者:行者123 更新时间:2023-11-30 18:18:42 25 4
gpt4 key购买 nike

我目前正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com