【问题标题】:NullReferenceException with Entity Framework and MultithreadingNullReferenceException 与实体框架和多线程
【发布时间】:2012-05-09 14:55:23
【问题描述】:

我在 Parallel.ForEach 循环中使用实体框架保存数据。 知道 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 都不为空。

感谢您的帮助。

【问题讨论】:

  • 它背后的数据库是什么?是甲骨文吗?
  • 不可能在该行上抛出 NullRef 异常。您是否使用调试符号进行编译?你确定当你中断时你在正确线程的调用堆栈上吗?
  • 这是一个 SQLServer 数据库。
  • @Slugart 我正在调试模式下编译,我很确定我中断了正确的线程调用。我也对该行上的 NullReferenceException 感到困惑,但这就是正在发生的事情。
  • @Leslie 我会尝试让事情更明确以暴露异常的可能性。将 new Entities() 分解为一个 var,然后在调用 Add() 之前在三个 var 中的每一个上断言 not null。还可以尝试清理和重建所有内容。

标签: c# multithreading entity-framework


【解决方案1】:

您应该将ConcurrentDictionary 用于ThreadContexts

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

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

【讨论】:

    猜你喜欢
    • 2011-04-04
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多