0

例:

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?
}

//...

4

2 に答える 2

1

OnMethodInvocationAspect にはかなりのオーバーヘッドがあるため、代わりに OnMethodBoundaryAspect を使用する必要があります。アスペクトの効果が非常に軽量であることを考えると、PostSharp 2.0 Professional Edition ははるかに効率的なコードを生成します。

于 2010-07-11T06:08:12.457 に答える
1

これにより、コレクションのロックが解放されるのを待つ間、すべてのメソッド呼び出しが効果的に強制的にブロックされるでしょうか? (ポストシャープ コード ブロックを完成できるようにするため)。

はい

MSMQ を使用した非同期メッセージングは​​、この問題に対するノンブロッキング ソリューションを可能にしますか?

多分。msmq が送信要求を処理する方法の内部の詳細は文書化されていません (私の知る限り)。

他のオプションは、スレッド固有の (同期されていない) コレクションを使用することです。また、共有コレクションのロックが解除された場合にのみ、コンテンツを共有コレクション (同期されていない) に移動します。

于 2010-07-09T19:21:31.983 に答える