【发布时间】:2015-08-26 11:11:33
【问题描述】:
我继承了一个应用程序,该应用程序具有从 asp.net 应用程序调用的服务类,如下所示:
class PeopleService : IPeopleService
{
//...
public void SavePerson(Person person)
{
person.UniqueId = _idGenerationService.GetNextId(person);
//...
_dbContext.InsertOrUpdate(person);
_dbContext.Commit();
}
}
class IdGenerationService : IIdGenerationService
{
//...
public string GetNextId(Person person)
{
int nextId = _dbContext.People.Count(x => x.Gender == person.Gender) + 1;
return string.Format("AB{0}", nextId);
}
}
GetNextId(Person) 的实现不是线程安全的,而且我们有很多具有重复 id 的 Person 对象,例如 AB1、AB2、AB2 等...
解决方案是将lock 应用于SavePerson(Person),如下所示:
class PeopleService : IPeopleService
{
private static readonly Object ReadIdLock = new Object();
//...
public void SavePerson(Person person)
{
lock(ReadIdLock)
{
person.UniqueId = _idGenerationService.GetNextId(person);
//...
_dbContext.InsertOrUpdate(person);
_dbContext.Commit();
}
}
}
现在我们尝试通过在 asp.net 应用程序中同时点击“保存”按钮来测试代码。但修复没有奏效!有趣的是,只有第一条记录似乎是重复的,比如 AB1、AB1、AB2、AB3...
多个请求如何访问锁定的语句?我应该改用Mutex 吗?
(请注意这个例子不是生产代码,它是一个简化的代码来表达我们遇到的问题。另外,小点,我们使用 StructureMap 作为 DI)。
【问题讨论】:
标签: c# asp.net multithreading locking structuremap