0

我目前在调度服务中工作,该服务使用 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 个小时试图找出可能的解决方法。

4

2 回答 2

2

对并发 WCF 调用使用共享上下文是非常糟糕的做法。您应该始终为每次调用使用新的上下文。我在这里解释了原因。

于 2010-09-22T18:51:15.767 回答
1

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

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

于 2010-09-23T00:15:11.513 回答