Is DataRow thread safe? How to update a single datarow in a datatable using multiple threads? - .net

Posted by NLV on Stack Overflow See other posts from Stack Overflow or by NLV
Published on 2010-04-13T11:34:31Z Indexed on 2010/04/13 11:43 UTC
Read the original article Hit count: 482

Hello all

I want to update a single datarow in a datatable using multiple threads. Is this actually possible?

I've written the following code implementing a simple multi-threading to update a single datarow. I get different results each time. Why is it so?

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


}

Any thoughts on this?

Thank you

NLV

© Stack Overflow or respective owner

Related posts about multithreading

Related posts about .NET