1 回答
TA贡献2011条经验 获得超2个赞
lock (new object())每次使用都会创建一个新对象。这意味着每个线程锁定不同的对象。这根本不是锁定。
如果您的两个服务不使用相同的资源,则不需要锁定。但是正如我从您的异常中看到的那样,您在两个服务之间使用共享资源 - 这是实体框架 DbContext。
我想一个线程正在初始化 DbContext,同时第二个线程正在使用相同的 DbContext。正如您从异常消息中看到的:
创建模型时不能使用上下文。如果在 OnModelCreating 方法中使用上下文,或者多个线程同时访问相同的上下文实例,则可能会引发此异常。请注意,不保证 DbContext 和相关类的实例成员是线程安全的。
更好的锁定是:
private object _lock = new object();
public EnumConversionStatus GenerateRmsImportFiles(int submissionId)
{
lock (_lock)
{
using (var client = new RMSConversionService.RMSConversionServiceClient())
{
var result = client.GenerateRmsImportFiles(submissionId);
client.Close();
return result;
}
}
}
public EnumConversionStatus GenerateAirImportFiles(int submissionId)
{
lock (_lock)
{
using (var client = new AIRConversionService.AirConversionServiceClient())
{
var result = client.GenerateAirImportFiles(submissionId);
return result;
}
}
}
- 1 回答
- 0 关注
- 225 浏览
添加回答
举报