0

例子:

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

//...

4

2 回答 2

1

这会有效地强制所有方法调用在等待释放集合上的锁时阻塞吗?(以便他们可以完成 postsharp 代码块)。

是的

使用 MSMQ 的异步消息传递是否可以为这个问题提供非阻塞解决方案?

也许。msmq 如何处理发送请求的内部细节没有记录(据我所知)。

其他选项是使用特定于线程的(非同步的)集合。并且仅当共享集合上的锁空闲时才将其内容移动到共享集合(不同步)。

于 2010-07-09T19:21:31.983 回答
1

您应该使用 OnMethodBoundaryAspect,因为 OnMethodInvocationAspect 开销很大。鉴于您的方面的效果非常轻量级,PostSharp 2.0 专业版将生成更高效的代码。

于 2010-07-11T06:08:12.457 回答