2010-07-09 39 views
0

例一個Web應用程序:儀器方法的調用使用PostSharp

我添加了一個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? 
} 

// ...

回答

1

這是否會有效地迫使所有的方法調用阻止,而他們等待鎖關於要發佈的集合? (以便他們可以完成postsharp代碼塊)。

將使用MSMQ實現無阻塞的解決了這個問題異步消息傳遞?

也許吧。關於msmq如何處理髮送請求的內部細節沒有記錄(據我所知)。

其他選項將使用線程特定(不同步)的集合。只有在共享集合上的鎖定爲空時,纔將其內容移至共享集合(不同步)。

1

您應該使用OnMethodBoundaryAspect,因爲OnMethodInvocationAspect具有很大的開銷。鑑於您的方面的影響非常輕,PostSharp 2.0專業版將生成更高效的代碼。

相關問題