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 關注
- 256 瀏覽
添加回答
舉報