我正在尝试使用此代码:
foreach (var r in _vm.Rules.Take(20)) {
Task.Factory.StartNew(() => {
new SQLRuleSerializer().SaveRule(_vm.SelectedKey, r);
});
}
错误:
事务(进程ID 600)在锁资源上与另一个进程发生死锁,并被选为死锁牺牲品。重新运行该交易。
考虑到我没有任何明确的锁,我不确定这是怎么死锁的...我猜问题是串行器是一个代理,即使是通过单独的实例也无法并行调用?
答案 0 :(得分:9)
事务(进程ID 600)在锁资源上与另一个进程发生死锁,并被选为死锁牺牲品。重新运行该交易。
死锁来自SQL Server,而不是C#代码。
答案 1 :(得分:1)
您尝试并行保存20个不同的规则,但似乎每个保存都需要SQL服务器上的一些锁。这意味着并行化很可能没有增益,所以你应该使用普通循环而不使用TPL。