例子:
我将 PostSharp 属性添加到方法中,以确保在调用方法之前启动秒表,并在调用返回后立即停止。该方法用于 Web 应用程序,因此会被多个线程调用。
我将秒表计时的结果存储在静态线程安全集合中,供所有线程使用。然后可以由另一个监视线程读取此集合以进行分析。
这会有效地强制所有方法调用在等待释放集合上的锁时阻塞吗?(以便他们可以完成 postsharp 代码块)。
使用 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?
}
//...