C# 具有实体框架和多线程的NullReferenceException

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

我正在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;
        }
    }
}
ThreadContext、threadId和新实体不为空

感谢您的帮助。

您应该使用for
ThreadContexts

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

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>));