2017-10-18 45 views
2

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

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。

我不知道如何让他们平行?

+0

你可能想看看[此帖](https://stackoverflow.com/questions/487661 /我怎么做 - 暂停绘制一个控制和它的孩子)来提高你的DataGridView的性能。使用此解决方案,使用某些标准Windows窗体控件,我获得了巨大的性能提升。 –

回答

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();
+0

感谢您的回复,我更新了我的调用方法。但我想同时填写gridviews。如果我在button1_click方法中写入更新代码,则填充程序运行得更加顺畅。我想在Windows窗体应用程序中进行平行更改。 – snur

+0

将这两个'Task.Run'放在同一个'button1_Click'事件处理程序中。并且被告知UI线程是一个单线程,并且您可以随时在UI线程中拥有一个任务。但与您共享的示例代码使您的UI线程可以响应,并让UI相关代码在UI线程上运行。 –

+0

我不确定核心的数量,但确定只有一个线程的线程数量。 –