微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我在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和新实体不为空.

谢谢你的帮助.

解决方法

你应该使用 ConcurrentDictionary for threadcontexts.

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐