代码之家  ›  专栏  ›  技术社区  ›  Ben Aston

使用Postharp在Web应用程序中插入方法调用

  •  0
  • Ben Aston  · 技术社区  · 15 年前

    例子:

    我为一个方法添加了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?
    }
    

    /…

    2 回复  |  直到 15 年前
        1
  •  1
  •   Igal Serban    15 年前

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

    是的

    使用msmq的异步消息传递是否能够实现此问题的非阻塞解决方案?

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

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

        2
  •  1
  •   Gael Fraiteur    15 年前

    您应该使用onMethodBoundarySpect,因为onMethodInvocationSpect有很大的开销。考虑到方面的影响非常轻,PostSharp2.0专业版将生成更高效的代码。