0

モジュール/メソッドの実行時間を見つけるためにトレースクラスを書いています。私はこのようなクラスを持っています

public class Trace
    {
        static Dictionary<string, Stopwatch> watches = null;

        static Trace()
        {
            Dictionary<string, Stopwatch> watches = new Dictionary<string, Stopwatch>();
        }

        public static void Start(string key, string losgMessage)
        {
            try
            {
                if (!watches.Keys.Contains(key))
                {
                    Stopwatch watch = new Stopwatch();
                    watch.Start();
                    watches.Add(key, watch);
                }
            }
            catch
            {
            }
        }

        public static void Stop(string key, Object logMessage, string sessionId)
        {
            try
            {

                if (!watches.Keys.Contains(key))
                {
                    Stopwatch watch = watches[key];
                    watch.Stop();
                    //log goes here
                }
            }
            catch
            {
            }
        }
    }

wcfはマルチスレッド環境であり、「watches」静的変数スコープはアプリケーションレベルであるため、誰か(異なるクライアントからの新しいrqst)が同じキーで同じメソッドを実行しようとすると、それを考慮せずにトレースします。したがって、この場合の最良のオプションは何でしょうか。どんな提案も役に立ちます。

編集:現在、sessionIdにキーを追加しています。セッションIDなしでこの問題を解決できません

4

1 に答える 1

1

セッションIDなしでこの問題を解決することはできません

提供された情報から、私はノーと言うでしょう。同じ関数呼び出しを実行する同時リクエストがある場合は、重複するエントリを取得します。これを回避する唯一の方法は、すべてのキーが一意であることを確認することです。とにかくセッションIDを使用する必要があると思いますが、そうでない場合、関数をリクエストにマップするにはどうすればよいですか?

また、Dictionaryはスレッドセーフではありません(少なくとも書き込みの場合)。ConcurrentDictionaryを使用することをお勧めします

于 2012-09-17T12:34:51.487 に答える