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

标签 c# multithreading datagridview task-parallel-library

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

相关文章:

c++ - MFT 的大小与 MFT 的解析

ios 基于 key 创建写锁

c++ - 多次等待同一个锁

c# - 文本框中所选 dataGridView 单元格的值

c# - 事件目录的角色安全

c# - 如何在gherkin中实现techtalk.specflow中的数据表

c# - 将负值转换为 0

c# - 使用 C# 在 Datagridview 中绘制统计图

c# - 通过 XPath 在任意深度选择 XML 节点

c# - Mono、C# 和 Glade 入门# : How to make window appear?