我有以下代码可以完成一些数据库工作:
[WebMethod]
public void FastBulkAdd(int addmax){
Users[] uploaders = db.Users.Take(addmax).ToArray();
Parallel.ForEach(uploaders, item =>
{
Account account;
lock (this)
{
account = item.Account;
}
}
每个用户都有 1 个帐户,DB 通过外键在另一个表中引用该帐户(我确定每个用户都有 1 个帐户)。我必须锁定那段代码,因为多线程数据库连接会产生错误。当我将此设置 addmax 设置为 1(允许 1 个线程执行)时,它工作得很好,但是如果 addmax 大于 1 并且执行了多个线程,则 account 将始终为 null,这会在稍后生成异常。这几乎就像锁被跳过了。
更新:我不相信帐户总是空的,所以我做了以下事情:
int tries = 0;
while (account == null && tries < 100)
{
lock (this)
{
account = item.Account;
}
tries++;
}
它奏效了。不是一个非常整洁的解决方案。我想知道问题的原因,以便将来避免这种设计危险。