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 和新实体不为空。

我感谢您的帮助。

NullReferenceException with Entity Framework and Multithread

您应该使用 ConcurrentDictionary 表示ThreadContexts

更好的是:找到一种在线程中捕获上下文实例的方法,例如通过执行并行任务:

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