我想使用多个线程更新数据表中的单个数据行。这实际上是可能的吗?
我编写了以下代码,实现了一个简单的多线程来更新单个数据行。我每次都得到不同的结果。为什么会这样?
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
答案 0 :(得分:3)
根据MSDN:
此类型对于多线程读取操作是安全的。您必须同步任何写操作。
因此,由于您要更新DataRow
和DataTable
个对象,因此需要使用某种形式的同步来保证代码的线程安全。
顺便说一句,你也不应该在你的UI线程中调用Thread.Sleep
或执行繁忙的循环。否则,UI将完全无响应,直到所有线程都已完成执行。相反,您应该在UI上显示某种进度条(或只是一个微调器),可以选择通过线程中的事件进行更新。 BackgroundWorker课程专门为您的工作量而设计,因此您可能需要考虑使用它。
答案 1 :(得分:0)
除非类型或成员的文档另有说明: