例:
PostSharp 属性をメソッドに追加して、メソッドが呼び出される前にストップウォッチが開始され、呼び出しが返された直後に停止するようにします。このメソッドは Web アプリで使用されるため、複数のスレッドから呼び出されます。
すべてのスレッドで使用できるように、ストップウォッチのタイミングの結果を静的スレッドセーフ コレクションに格納します。このコレクションは、分析のために別の監視スレッドで読み取ることができます。
これにより、コレクションのロックが解放されるのを待つ間、すべてのメソッド呼び出しが効果的に強制的にブロックされるでしょうか? (ポストシャープ コード ブロックを完成できるようにするため)。
MSMQ を使用した非同期メッセージングは、この問題に対するノンブロッキング ソリューションを可能にしますか?
PostSharp 属性コード:
//...
public static ThreadSafeCollection _collection;
public override void OnInvocation(MethodInvocationEventArgs eventArgs)
{
var start = DateTime.Now;
eventArgs.Proceed();
var timeSpent = (DateTime.Now - start).TotalMilliseconds;
_collection.Add(timeSpent); //will this cause all
//method calls to methods
//decorated with this
//attribute to block on the
//_collection addition?
}
//...