2010-07-09 1 views
0

예를 사용하여 웹 응용 프로그램에서 호출계측 PostSharp

난 그냥 호출이 반환 후 메소드가 호출되기 전에 스톱워치가 시작되었는지 확인하는 방법에 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

은 잠금을 기다리는 동안 차단 호출 출시 될 컬렉션에? (그래서 그들은 포스트 샤프 코드 블록을 완성 할 수있다).

예 MSMQ는이 문제에 대한 비 차단 솔루션을 가능하게하여

겠습니까 비동기 메시징?

아마도. msmq가 보내기 요청을 처리하는 방법에 대한 내부 정보는 (필자가 아는 한) 문서화되지 않았습니다.

다른 옵션은 스레드 특정 (동기화되지 않음) 컬렉션을 사용하는 것입니다. 공유 컬렉션의 잠금이 해제 된 경우에만 해당 콘텐츠를 공유 컬렉션으로 이동합니다 (동기화되지 않음).

1

OnMethodInvocationAspect에 상당한 오버 헤드가 있기 때문에 오히려 OnMethodBoundaryAspect를 사용해야합니다. aspect의 효과가 매우 가볍다면, PostSharp 2.0 Professional Edition은 훨씬 더 효율적인 코드를 생성합니다.