1

これで、すべてのサブスクリプションを格納するためのディクショナリを持つイベントプロセッサクラスができました。実際、それは辞書の辞書です。また、このプロセスクラスは、サードパーティのリモートサーバーと通信して、ターゲットデータを要求します。サブスクリプションが失われることがあるという問題が発生しているため、この質問をしています。何らかの理由で、この損失がリモートサーバーへの接続で発生するかどうかを確認するのは難しいため、最初に、イベントプロセッサクラスに問題があるかどうかを確認する必要があります。そして、私の最初の疑いは、このディクショナリオブジェクトのオーバーフローが原因でサブスクリプション情報が失われた場合です。誰かが何か考えを持っていますか?ありがとう!

アップデート

コードを表示するのは簡単ではないので、シナリオについてもう少し説明する必要があります。以前は、レガシーSWをAと呼び、Bのベンダーが提供するAPIを使用してBと呼ばれるリモートデータサービスと通信していました。ただし、Aを64ビットSWに変更していますが、B用に提供されているライブラリはまだ32ビットであるため、新しい64ビットAはこのライブラリを使用できなくなります。そこで、WCFを使用して64ビットAとの通信を維持しながら、ライブラリを使用してBに接続するCと呼ばれる32ビットSWを設計しています。前に述べたように、Cは主にpub / sub構造であるため、Dictionary of Dictionaryを使用して、Cでのリクエストとサブスクリプションを維持しています。ただし、サブスクリプションを再初期化した後、Aでパブリケーションを取得できます)。Bのフィードバックをチェックして、構成に誤りがないかどうかを確認するのは簡単ではありません。また、私のWCFサービスログにもエラーは表示されません。私は問題がCだけで起こるのではないかと疑わなければなりません。私はマルチスレッドの問題を認識しているので、辞書のすべての操作をロックしました。しかし、私は何が間違っているのか考えられません。ところで、Cとは異なり、メモリが使い果たされてCがクラッシュしました。

4

2 に答える 2

6

「オーバーフロー」とは、「予期せずにデータをサイレントに失う」ことを意味する場合、私が知る限りではありません。

「クラッシュするまでシステムのすべてのメモリを使い果たす」という意味であれば、そうです、それは可能ですが、あなたに起こっていることのようには聞こえません。

Dictionary<,>ロックなしで複数のスレッドの標準を使用している場合、データが失われる可能性があります。ロックを使用するか(慎重に!)ConcurrentDictionary<,>、.NET4を使用している場合は使用する必要があります。

また、予期しない重複キーがある場合、インデクサーを使用すると、あるエントリのデータが別のエントリで上書きされます。(メソッドを使用する場合はそうではありませんAdd-代わりに例外をスローします。

基本的に、コードが表示されるか、少なくともコンテキストが増えるまで推測しています...

于 2012-07-06T19:03:37.297 に答える
2

競合状態のレシピのように聞こえます。

次のようなコードがあるかもしれません:

if (!myDictionary.ContainsKey(key))
{
  //point of interest
  myDictionary[key] = new Dictionary<X, Y>()
}
myDictionary[key][innerkey] = innnervalue;

問題は、2つのスレッドが条件付きのポイントコメントに到達することです。同じキーに対してそのブロックを2回実行するつもりはありませんが、スレッドマジックによってそれが実現します。

  1. スレッドAとスレッドBは、関心のあるポイントに到達します。
  2. スレッドAがウェイクアップし、残りのメソッドを実行します。
  3. スレッドBが起動して実行され、スレッドAによって作成されたディクショナリが孤立します。

これを修正するには、ロックの背後にある共有インスタンスを保護します。

lock(_theLockInstance)
{
  if (!myDictionary.ContainsKey(key))
  {
    //point of interest
    myDictionary[key] = new Dictionary<X, Y>()
  }
  myDictionary[key][innerkey] = innnervalue;
}

これで、一度に1つのスレッドのみがクリティカルセクションに到達でき、孤立した辞書は作成されません。

于 2012-07-06T19:11:02.660 に答える