0

私は現在、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時間を失いました。

4

2 に答える 2

2

同時WCF呼び出しに共有コンテキストを使用することは、実際には悪い習慣です。呼び出しごとに常に新しいコンテキストを使用する必要があります。ここで理由を説明しました。

于 2010-09-22T18:51:15.767 に答える
1

良い答えはありませんが、同様の問題に直面したときに、静的な共通のSystem.Collections.Concurrent.ConcurrentBagにすべての変更を追加し、すべてのスレッド/タスクが終了した後にそれらをコミットすることになりました。

これは妥協案ですが、「十分に良い」解決策かもしれません。

于 2010-09-23T00:15:11.513 に答える