2010-04-13 66 views
1

我想使用多個線程更新數據表中的單個數據行。這實際上可能嗎?DataRow線程安全嗎?如何使用多線程更新數據表中的單個數據行? - .net 2.0

我寫了下面的代碼實現一個簡單的多線程來更新單個數據行。每次我都會得到不同的結果。爲什麼這樣?

public partial class Form1 : Form 
{ 
    private static DataTable dtMain; 
    private static string threadMsg = string.Empty; 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     Thread[] thArr = new Thread[5]; 
     dtMain = new DataTable(); 
     dtMain.Columns.Add("SNo"); 
     DataRow dRow; 
     dRow = dtMain.NewRow(); 
     dRow["SNo"] = 5; 
     dtMain.Rows.Add(dRow); 
     dtMain.AcceptChanges(); 
     ThreadStart ts = new ThreadStart(delegate { dtUpdate(); }); 
     thArr[0] = new Thread(ts); 
     thArr[1] = new Thread(ts); 
     thArr[2] = new Thread(ts); 
     thArr[3] = new Thread(ts); 
     thArr[4] = new Thread(ts); 

     thArr[0].Start(); 
     thArr[1].Start(); 
     thArr[2].Start(); 
     thArr[3].Start(); 
     thArr[4].Start(); 

     while (!WaitTillAllThreadsStopped(thArr)) 
     { 
      Thread.Sleep(500); 
     } 

     foreach (Thread thread in thArr) 
     { 
      if (thread != null && thread.IsAlive) 
      { 
       thread.Abort(); 
      } 
     } 
     dgvMain.DataSource = dtMain; 

    } 

    private void dtUpdate() 
    { 
     for (int i = 0; i < 1000; i++) 
     { 
      try 
      { 
       dtMain.Rows[0][0] = Convert.ToInt32(dtMain.Rows[0][0]) + 1; 
       dtMain.AcceptChanges(); 
      } 
      catch 
      { 
       continue; 
      } 
     } 
    } 

    private bool WaitTillAllThreadsStopped(Thread[] threads) 
    { 
     foreach (Thread thread in threads) 
     { 
      if (thread != null && thread.ThreadState == ThreadState.Running) 
      { 
       return false; 
      } 
     } 
     return true; 
    } 


} 

對此有何看法?

謝謝

NLV

回答

2

根據MSDN

這種類型是安全的多線程讀取操作。您必須同步任何寫入操作。

那麼既然要更新DataRowDataTable對象,你將需要使用某種形式的同步,以保證你的代碼是線程安全的。

順便說一句,你也不應該叫Thread.Sleep或在你的UI線程中做一個繁忙的循環。否則,在所有線程完成執行之前,UI將完全無響應。相反,你應該在UI上顯示某種進度條(或者只是一個微調器),它可以根據線程中的事件進行更新。 BackgroundWorker類是專門爲使您的工作更輕鬆而設計的,因此您可能需要考慮使用它。

1

除非該類型或成員的說明文件另有說明:

  • 靜態成員是線程安全的。
  • 實例成員是不是線程安全。