使用datagridview

时间:2017-10-18 21:53:20

标签: c# .net multithreading winforms datagridview

我在表单应用程序上创建了2个数据网格视图。我填写了0到100列。 我想同时填充两个网格视图的原始数据。为了填充raws,我创建了两个线程,并使用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或任务并行库数据网格视图调用主程序上的线程时,值的填充工作处于sequantial状态。

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

1 个答案:

答案 0 :(得分: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; }));
    });
}

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

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

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