【问题标题】:Multiple threading with datagridview使用 datagridview 进行多线程处理
【发布时间】:2017-10-18 21:53:19
【问题描述】:

我在表单应用程序上创建了 2 个数据网格视图。我填写了 0 到 100 的两列。 我想同时填充两个网格视图的原始数据。为了制作填充原料,我创建了两个线程,并使用 Invoke 方法来解决跨线程异常;

public void thread1()
    {        dataGridView1.BeginInvoke(new Action(delegate ()
        {
            a = 0;

            dataGridView1.Rows.Add(20);
            for (int i = 0; i < 100; i++)
            {
                dataGridView1.Rows[a].Cells[0].Value = i;
                dataGridView1.Rows[a].Cells[1].Value = i + 1;
                dataGridView1.Rows[a].Cells[2].Value = i + 2;
                dataGridView1.Rows[a].Cells[3].Value = i + 3;
                dataGridView1.Rows[a].Cells[4].Value = i + 4;

                if (i % 5 == 0) { a++; }
                dataGridView1.Refresh();
            }
        }));

    }

但是当我使用 Parallel.Invoke 或 Task Parallel Library 数据网格视图调用主程序上的线程时,值的填充工作是连续的。

我想知道如何让它们并行化??

【问题讨论】:

  • 您可能需要查看this post 以进一步提高 DataGridView 的性能。使用此解决方案,我通过一些标准的 Windows 窗体控件实现了巨大的性能提升。

标签: c# .net multithreading winforms datagridview


【解决方案1】:

您不应该将耗时的任务放在Control.Invoke 代码块中,因为它会在 UI 线程中运行,并且会使 UI 线程忙碌并使您的线程无用。因此,只需将 UI-reladet 代码放入 Invoke 操作即可。

您可以这样使用Task.Run 填充每个DataGridView

private void button1_Click(object sender, EventArgs e)
{
    Task.Run(() =>
    {
        //Define DataTable
        var table = new DataTable();
        table.Columns.Add("Column 1", typeof(int));

        //Fill DataTable
        for (int i = 0; i < 100000; i++)
            table.Rows.Add(new object[] { i });

        //Set DataSource
        dataGridView1.Invoke(new Action(() => { dataGridView1.DataSource = table; }));
    });
}

您也可以在button1_Click 事件处理程序中使用类似的Task.Run 代码块来填充其他DataGridView 控件。

您可以使用以下任一选项:

  • Task.Run(()=&gt;{ /* something */ });
  • new Thread(new ThreadStart(() =&gt; { /* something */ })).Start();

【讨论】:

  • 感谢您的回复,我更新了调用方法。但我想同时填充网格视图。如果我在 button1_click 方法中编写更新代码,填充物会连续运行。我想在 Windows 窗体应用程序中进行并行更改。
  • 将这两个Task.Run 放在同一个button1_Click 事件处理程序中。并被告知 UI 线程是一个单线程,并且在任何时候您都可以在 UI 线程中拥有一个任务。但是与您共享的示例代码使您的 UI 线程具有响应性,并让与 UI 相关的代码仅在 UI 线程上运行。
  • 我不确定核心数,但可以确定只有一个线程的线程数。
  • 再次感谢。现在该程序的性能比第一个更好。当我这样写时:'dataGridView1.Invoke(new Action(() => { dataGridView1.DataSource = table; dataGridView1.Refresh();}));'数据网格视图一一刷新。据我了解,由于主 ui 线程是单线程。
  • 我正在尝试使用所有可用的内核以获得更好的性能。它的任务是否只使用一个核心?当我观察性能监视器时,吞吐量不是最大的。我想在所有可用的内核上运行我的代码以获得最佳性能。我可以在控制台应用程序中使用线程池,但不能在表单应用程序中实现。
猜你喜欢
  • 2013-08-03
  • 2019-04-23
  • 2018-12-17
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-04
相关资源
最近更新 更多