2017-10-18 88 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

我不確定核心的數量,但確定只有一個線程的線程數量。 –