并发访问EF4实体(并行+ EF4)

时间:2010-09-22 14:39:57

标签: wcf .net-4.0 entity-framework-4 parallel-processing parallel-extensions

我目前正在使用调度程序服务,该服务使用EF4和WCF处理在不同渠道(电子邮件,私人消息,应用程序消息)中传递的数千条消息。

为了加快消息调度,我正在尝试使用Parallels:

Parallel.ForEach(currentMessageList, m =>
{
Processors.DispatcherWrapper.Dispatch(m, m.unfChannels.AgentName, m.unfChannels.AgentParameters);
}
);

My Dispatch方法使用反射来匹配通道配置方法并同时处理每个消息,但是当我将SaveChanges()发送到全局实体(它在application_start上初始化)时,我在尝试更新线程内的EF对象时遇到大问题

问题有各种各样的风格:

  • 空对象引用
  • 列表项属性是对象密钥信息的一部分,无法修改。
  • 基础提供程序在Open上失败。
  • 不允许新事务,因为会话中还有其他线程在运行。 (强制连接打开后关闭)

问题是EF4是否可以线程安全地实现这种情况? 我的方法是将全局实体作为最佳解决方案,还是应该为每个任务进行EF4初始化?

欢迎任何帮助,我已经失去了2个小时试图找出可能的解决方法。

2 个答案:

答案 0 :(得分:2)

使用共享上下文进行并发WCF调用是非常糟糕的做法。您应该始终为每个呼叫使用新的上下文。我解释了原因here

答案 1 :(得分:1)

我没有一个很好的答案,但面对一个类似的问题,我最后将所有更改添加到静态公共System.Collections.Concurrent.ConcurrentBag,然后在所有线程/任务完成后提交它们。

这是妥协,但可能是一个“足够好”的解决方案。