我在Parallel.ForEach循环中使用Entity Framework保存数据.
知道EF不是线程安全的,我为每个线程实例化一个实体上下文.
知道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] 举报,一经查实,本站将立刻删除。