1

我正在试验这段代码:

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

错误:

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

考虑到我没有任何显式锁,我不确定这是如何死锁的。我想问题是序列化程序是一个代理,即使通过单独的实例也不能并行调用?

4

2 回答 2

9

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

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

于 2012-06-12T18:07:52.693 回答
1

您正在尝试并行保存 20 条不同的规则,但似乎每次保存都需要 SQL 服务器上的一些锁。这意味着并行化很可能没有任何好处,因此您应该使用普通循环而不使用 TPL。

于 2012-06-12T18:32:27.643 回答