C# 具有实体框架和多线程的NullReferenceException
我正在Parallel.ForEach循环中使用实体框架保存数据。 知道EF不是线程安全的,我为每个线程实例化了一个实体上下文 1-安全吗? 正如我在这些帖子中看到的: 2-在创建我的上下文的过程中有一个异常,但3次中只有一次,我不知道为什么 以下是我创建上下文的代码:C# 具有实体框架和多线程的NullReferenceException,c#,multithreading,entity-framework,C#,Multithreading,Entity Framework,我正在Parallel.ForEach循环中使用实体框架保存数据。 知道EF不是线程安全的,我为每个线程实例化了一个实体上下文 1-安全吗? 正如我在这些帖子中看到的: 2-在创建我的上下文的过程中有一个异常,但3次中只有一次,我不知道为什么 以下是我创建上下文的代码: public partial class Entities { private static Entities mfgEntities = new Entities(); private static rea
public partial class Entities
{
private static Entities mfgEntities = new Entities();
private static readonly Dictionary<int,Entities> ThreadContexts = new Dictionary<int, Entities>();
public static Entities Context
{
get
{
if (HttpContext.Current != null)
{
string objectContextKey = HttpContext.Current.GetHashCode().ToString("x");
if (!HttpContext.Current.Items.Contains(objectContextKey))
{
HttpContext.Current.Items.Add(objectContextKey, new Entities());
}
return HttpContext.Current.Items[objectContextKey] as Entities;
}
else
{
int threadId = Thread.CurrentThread.ManagedThreadId;
if (!ThreadContexts.ContainsKey(threadId))
{
try
{
ThreadContexts.Add(threadId, new Entities());
}
catch (Exception ex)
{
throw new Exception("Erreur lors de la création de l'entity context");
}
}
return ThreadContexts[threadId];
}
return mfgEntities;
}
}
}
ThreadContext、threadId和新实体不为空
感谢您的帮助。您应该使用forThreadContexts
更好:找到一种在线程中捕获上下文实例的方法,例如通过执行:
var task1=新任务(()=>);
它背后的数据库是什么?是Oracle吗?在该行上不可能抛出NullRef异常。是否使用调试符号编译?您确定中断时使用的是正确线程的调用堆栈吗?这是一个SQLServer数据库。@Slugart我正在调试模式下编译,我非常确定中断时使用的是正确线程的调用。我也对这一行中的NullReferenceException感到困惑,但事实就是如此。@Leslie我会尝试让事情变得更明确,以暴露异常的不可能性。将新实体()拆分为一个变量,然后在调用Add()之前,在三个变量中的每一个上都断言NOTNULL。还可以尝试清理和重建一切。
ThreadContexts.Add(threadId, new Entities());
var task1 = new Task(() => <your method that instantiates a context>));