DataRow线程安全吗?如何使用多个线程更新数据表中的单个数据行? - .net 2.0

时间:2010-04-13 11:34:32

标签: .net multithreading datarow thread-safety

我想使用多个线程更新数据表中的单个数据行。这实际上是可能的吗?

我编写了以下代码,实现了一个简单的多线程来更新单个数据行。我每次都得到不同的结果。为什么会这样?

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 个答案:

答案 0 :(得分:3)

根据MSDN

  

此类型对于多线程读取操作是安全的。您必须同步任何写操作。

因此,由于您要更新DataRowDataTable个对象,因此需要使用某种形式的同步来保证代码的线程安全。

顺便说一句,你也不应该在你的UI线程中调用Thread.Sleep或执行繁忙的循环。否则,UI将完全无响应,直到所有线程都已完成执行。相反,您应该在UI上显示某种进度条(或只是一个微调器),可以选择通过线程中的事件进行更新。 BackgroundWorker课程专门为您的工作量而设计,因此您可能需要考虑使用它。

答案 1 :(得分:0)

除非类型或成员的文档另有说明:

  • 静态成员是线程安全的。
  • 实例成员线程安全。