私は現在、EF4とWCFを使用してさまざまなチャネル(電子メール、プライベートメッセージ、アプリケーションメッセージ)で配信される何千ものメッセージを処理するディスパッチャサービスで働いています。
メッセージのディスパッチを高速化するために、Parallelsを使用しようとしています。
Parallel.ForEach(currentMessageList, m =>
{
Processors.DispatcherWrapper.Dispatch(m, m.unfChannels.AgentName, m.unfChannels.AgentParameters);
}
);
私のDispatchメソッドはリフレクションを使用してチャネル構成メソッドを照合し、各メッセージを同時に処理しますが、グローバルエンティティ(application_startで初期化されます)にSaveChanges()を作成すると、スレッド内のEFオブジェクトを更新しようとすると大きな問題が発生します
問題にはさまざまな種類があります。
- Nullオブジェクト参照
- リストアイテムプロパティはオブジェクトのキー情報の一部であり、変更できません。
- 基になるプロバイダーがOpenで失敗しました。
- セッションで実行されている他のスレッドがあるため、新しいトランザクションは許可されません。(閉じている場合は接続を強制的に開いた後)
問題は、EF4がこのシナリオを実装するためにスレッドセーフであるかどうかです。グローバルエンティティを持つという私のアプローチは最良の解決策ですか、それともタスクごとにEF4の初期化を行う必要がありますか?
どんな助けでも大歓迎です、私は可能な回避策を見つけようとしてすでに2時間を失いました。