NullReferenceException with Entity Framework and Multithread
本文关键字:and Multithread Framework Entity with NullReferenceException | 更新日期: 2023-09-27 18:33:42
我正在使用 Parallel.ForEach 循环中的实体框架保存数据。知道 EF 不是线程安全的,我为每个线程实例化了一个实体上下文。
1- 安全吗?似乎就像我在这些帖子中看到的那样:
实体框架 + 多线程 + 延迟加载
每个线程使用一个实体框架上下文是否安全?是的?如何?
2-在我的上下文创建过程中有一个例外,但只有 3 次中的一次,我找不到原因。
这是我创建上下文的代码:
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;
}
}
}
它在线抛出一个 NullReferenceException:
ThreadContexts.Add(threadId, new Entities());
ThreadContexts、threadId 和新实体不为空。
我感谢您的帮助。
您应该使用 ConcurrentDictionary
表示ThreadContexts
。
更好的是:找到一种在线程中捕获上下文实例的方法,例如通过执行并行任务:
var task1 = new Task(() => <your method that instantiates a context>));