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,然後在所有線程/任務完成後提交它們。

這是一個妥協,但可能是一個「足夠好」的解決方案。