在使用OrmLite进行一些测试时,我遇到了多线程的一些问题。 在某些情况下,使用来自不同线程的Repo我在FieldDefinitionMap上遇到了一个随机的“并发”错误。
重现错误非常简单,只需启动10个具有大量读/写操作的线程即可获得随机错误: “未找到字段定义ID”
为了重现错误以便在新线程上第一次使用更新/插入功能,这一点非常重要。
错误来自函数:
public virtual void SetParameterValues<T>(IDbCommand dbCmd, object obj)
我能够解决它对FieldDefinitionMap的锁定,如下所示:
namespace ServiceStack.OrmLite
public class ModelDefinition
public Dictionary<string, FieldDefinition> FieldDefinitionMap
{
get
{
lock (this) // Locking the get works without problems
{
if (fieldDefinitionMap == null)
{
fieldDefinitionMap = new Dictionary<string, FieldDefinition>();
foreach (var fieldDef in FieldDefinitionsArray)
{
fieldDefinitionMap[fieldDef.FieldName] = fieldDef;
}
}
return fieldDefinitionMap;
}
}
}
顺便说一下,我不知道是否有更好的解决方案。