3

マルチスレッド アプリケーションでイベントを収集するために辞書を使用しています。イベントを追加するときは lock を使用し、検索するときは使用しません。約 1 時間ごとに、特定の時間より古いイベントのクリーンアップを実行します。非常にシンプルで機能します。

ConcurrentDictionary に移動してロックを解除したいのですが、「Concurrent」を追加して、Add を TryAdd に変更するだけでよいと考えました。しかし、その後、LINQ が ToDictionary のみを返すというエラーが発生しました。私は明らかに LINQ を使用できませんが、LINQ を保存するためにできることがあるかどうか知りたいと思っていました。さらに重要なことは、ConcurrentDictionry に移行する前に考慮すべきことが他にありますか?

public class messageResult
        {
            public Result result;
            public DateTime receivedTime;
        }


public Dictionary<Guid, messageResult> events = new Dictionary<Guid, messageResult>();


lock (events)
            {
                events = events.Where(p => p.Value.receivedTime >= t).ToDictionary(p => p.Key, p => p.Value);
            }

ありがとう

4

2 に答える 2

0

ToDictionary 拡張方法はそれほど複雑ではないようで、独自のバージョンを作成できます。

ただし、ToDictionary1 つの辞書を使用してスレッド間で共有したい場合は、新しいオブジェクトが返されることに注意してください。

可変変数をロックしないでください(また、への実際の参照も変更していeventsます)、プライベート読み取り専用変数を作成し、それをロックに使用してください。

于 2013-10-01T20:59:50.580 に答える
0

ToDictionary は新しいインスタンスを返します...これは共有インスタンスとは異なります。

共有インスタンスを変更したいので、それを行うコードを書く必要があります:

foreach(var kvp in events.Where(...).ToList())
{
  var val = kvp.Value;
  events.TryRemove(kvp.Key out val);
}
于 2013-10-01T21:14:41.313 に答える