我目前正在使用调度程序服务,该服务使用EF4和WCF处理在不同渠道(电子邮件,私人消息,应用程序消息)中传递的数千条消息。
为了加快消息调度,我正在尝试使用Parallels:
Parallel.ForEach(currentMessageList, m =>
{
Processors.DispatcherWrapper.Dispatch(m, m.unfChannels.AgentName, m.unfChannels.AgentParameters);
}
);
My Dispatch方法使用反射来匹配通道配置方法并同时处理每个消息,但是当我将SaveChanges()发送到全局实体(它在application_start上初始化)时,我在尝试更新线程内的EF对象时遇到大问题
问题有各种各样的风格:
问题是EF4是否可以线程安全地实现这种情况? 我的方法是将全局实体作为最佳解决方案,还是应该为每个任务进行EF4初始化?
欢迎任何帮助,我已经失去了2个小时试图找出可能的解决方法。
答案 0 :(得分:2)
使用共享上下文进行并发WCF调用是非常糟糕的做法。您应该始终为每个呼叫使用新的上下文。我解释了原因here。
答案 1 :(得分:1)
我没有一个很好的答案,但面对一个类似的问题,我最后将所有更改添加到静态公共System.Collections.Concurrent.ConcurrentBag,然后在所有线程/任务完成后提交它们。
这是妥协,但可能是一个“足够好”的解决方案。