c# – 具有实体框架和多线程的NullReferenceException
发布时间:2020-12-15 21:34:02 所属栏目:百科 来源:网络整理
导读:我在Parallel.ForEach循环中使用Entity Framework保存数据. 知道EF不是线程安全的,我为每个线程实例化一个实体上下文. 1-安全吗? 这似乎就像我在这些帖子中看到的那样: Entity Framework + Multiple Threads + Lazy Load Is it safe to use one Entity Fra
我在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>)); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |