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

c# – 具有实体框架和多线程的NullReferenceException,第1张

概述我在Parallel.ForEach循环中使用Entity Framework保存数据. 知道EF不是线程安全的,我为每个线程实例化一个实体上下文. 1-安全吗? 这似乎就像我在这些帖子中看到的那样: Entity Framework + Multiple Threads + Lazy Load Is it safe to use one Entity Framework Context per 我在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>));
总结

以上是内存溢出为你收集整理的c# – 具有实体框架和多线程的NullReferenceException全部内容,希望文章能够帮你解决c# – 具有实体框架和多线程的NullReferenceException所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1228936.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存