【发布时间】:2020-05-08 06:28:07
【问题描述】:
我在使用 Parallel.Foreach 时遇到死锁错误。 我在数据表中有 1000 条记录,我创建了 5 个线程来处理它。 但是当我运行这个控制台应用程序时,在处理了一些记录之后,它会创建一个死锁,并且不会处理其他记录。 这是我的代码:
Parallel.ForEach(dt1.AsEnumerable(), new ParallelOptions { MaxDegreeOfParallelism = 5 }, dr =>
{
cmd1.CommandText = $"Update AuditMessage set Status=1" +
$" where SXAEASCoreAuditMessageID ='{Convert.ToString(dr["AuditMessageID"])}' ";
cmd1.CommandType = CommandType.Text;
cmd1.Transaction = trans;
cmd1.ExecuteNonQuery();
});
【问题讨论】:
-
因此,在多个线程中,您正在尝试修改相同的
SqlCommand对象。这不就像 5 个人试图同时驾驶同一辆车,每个人都有不同的目的地吗? -
你有什么 DBMS ?
-
你需要重新考虑这一点,对于每个并行不适合 IO 绑定的工作负载开始,另外在数据库中抛出更多线程很少能解决任何问题。数据库在内部是线程化的,并且在分配资源方面比您(客户端)更有效。因此,这变成了 X/Y 问题……您有一个要解决的问题,而实际上您的问题实际上是其他问题。沿着这条道路前进将是一个等待发生的重构。我建议为数据库制作一个更智能的查询,然后将线程全部丢弃并使用异步
标签: c# sql multithreading parallel-processing