gpt4 book ai didi

c# - Entity Framework 和多线程的 NullReferenceException

转载 作者:行者123 更新时间:2023-11-30 12:49:51 25 4
gpt4 key购买 nike

我在 Parallel.ForEach 循环中使用 Entity Framework 保存数据。知道 EF 不是线程安全的,我为我的每个线程实例化了一个实体上下文。

1- 安全吗?似乎就像我在这些帖子中看到的那样:

Entity Framework + Multiple Threads + Lazy Load

Is it safe to use one Entity Framework Context per thread? ... yes? how?

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 和新的 Entities 不为空。

谢谢你的帮助。

最佳答案

你应该使用 ConcurrentDictionary对于 ThreadContexts

甚至更好:找到一种方法来捕获线程中的上下文实例,例如通过执行 parallel tasks :

var task1 = new Task(() => <your method that instantiates a context>));

关于c# - Entity Framework 和多线程的 NullReferenceException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10518641/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com