2010-04-13 3 views
1

Je souhaite mettre à jour un seul datarow dans une datable en utilisant plusieurs threads. Est-ce réellement possible?Le thread DataRow est-il sûr? Comment mettre à jour un seul datarow dans une datatable en utilisant plusieurs threads? - .net 2.0

J'ai écrit le code suivant implémentant un multi-thread simple pour mettre à jour un seul datarow. Je reçois des résultats différents à chaque fois. Pourquoi est-ce vrai?

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; 
    } 


} 

Des commentaires à ce sujet?

Merci

VSN

Répondre

2

Selon MSDN:

Ce type est sans danger pour les opérations de lecture multithread. Vous devez synchroniser toutes les opérations d'écriture.

Donc, puisque vous mettez à jour DataRow et DataTable objets que vous aurez besoin d'utiliser une certaine forme de synchronisation pour garantir votre code est thread-safe. Par ailleurs, vous ne devriez jamais appeler Thread.Sleep ou faire une boucle occupée dans votre thread d'interface utilisateur. Sinon, l'interface utilisateur ne répondra pas complètement jusqu'à ce que tous les threads aient fini de s'exécuter. Au lieu de cela, vous devriez avoir une sorte de barre de progression (ou juste un spinner) affichée sur votre interface utilisateur, qui est éventuellement mise à jour par les événements de vos threads. La classe BackgroundWorker est spécialement conçue pour vous faciliter la tâche. Vous pouvez donc envisager de l'utiliser.

1

À moins que la documentation du type ou membre indique le contraire:

  • membres statiques sont thread-safe.
  • Les membres de l'instance sont et non thread safe.
Questions connexes