C# 4.0 任务库死锁

本文关键字:死锁 任务 | 更新日期: 2023-09-27 18:36:53

我正在试验这段代码:

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

错误:

事务(进程 ID 600)在与另一个进程的锁定资源上死锁,并被选为死锁受害者。重新运行事务。

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

C# 4.0 任务库死锁

事务(进程 ID 600)在与另一个进程的锁定资源上死锁,并被选为死锁受害者。重新运行事务。

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

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