我目前在调度服务中工作,该服务使用 EF4 和 WCF 处理通过不同渠道(电子邮件、私人消息、应用程序消息)传递的数千条消息。
为了加快消息发送速度,我尝试使用 Parallels:
Parallel.ForEach(currentMessageList, m =>
{
Processors.DispatcherWrapper.Dispatch(m, m.unfChannels.AgentName, m.unfChannels.AgentParameters);
}
);
我的 Dispatch 方法使用反射来匹配通道配置方法并同时处理每条消息,但是当我将 SaveChanges() 设置为全局实体时,尝试更新线程内的 EF 对象时遇到了很大问题(它在 application_start 上初始化)
问题有多种形式:
- 空对象引用
- 列表项 属性是对象的关键信息的一部分,不能修改。
- 基础提供程序在打开时失败。
- 不允许新事务,因为会话中还有其他线程在运行。(如果关闭则强制连接打开后)
问题是 EF4 是否是线程安全的来实现这个场景?我拥有全局实体的方法是最好的解决方案,还是应该按任务进行 EF4 初始化?
欢迎任何帮助,我已经失去了 2 个小时试图找出可能的解决方法。