C#4.0任务库死锁

时间:2012-06-12 18:06:24

标签: c# .net sql

我正在尝试使用此代码:

        foreach (var r in _vm.Rules.Take(20)) {
            Task.Factory.StartNew(() => {
                new SQLRuleSerializer().SaveRule(_vm.SelectedKey, r);
            });             
        }

错误:

  

事务(进程ID 600)在锁资源上与另一个进程发生死锁,并被选为死锁牺牲品。重新运行该交易。

考虑到我没有任何明确的锁,我不确定这是怎么死锁的...我猜问题是串行器是一个代理,即使是通过单独的实例也无法并行调用?

2 个答案:

答案 0 :(得分:9)

  

事务(进程ID 600)在锁资源上与另一个进程发生死锁,并被选为死锁牺牲品。重新运行该交易。

死锁来自SQL Server,而不是C#代码。

答案 1 :(得分:1)

您尝试并行保存20个不同的规则,但似乎每个保存都需要SQL服务器上的一些锁。这意味着并行化很可能没有增益,所以你应该使用普通循环而不使用TPL。