0

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

要尽量加快信息调度我想要使用的Parallels:

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

我的调度方法使用反射来匹配通道配置方法,并同时处理每封邮件,但我有很大的问题,尝试更新线程内EF对象时,我做的SaveChanges()到全球实体(它的初始化上的Application_Start)

问题有各种口味的:

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

问题是如果EF4是线程安全的以实现这种情况? 我的方法是让全球实体获得最佳解决方案,还是应该按EF4初始化进行每项任务?

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

+0

尝试初始化一个新的Entitie,并得到:一个EdmType不能映射到CLR类多次。 EdmType''被映射多次。 – hmf 2010-09-22 15:02:49

+1

ObjectContext不是线程安全的。 http://stackoverflow.com/questions/3258357/good-advices-to-use-ef-in-a-multithread-program – 2010-09-22 17:27:12

回答

2

使用共享上下文进行并发WCF调用是非常糟糕的做法。每次通话都应该使用新的上下文。我解释了原因here

1

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

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