2016-07-25 3 views
0

내가 사용하는 메서드의 실행 시간을 기록하기로되어있는 PostSharp 애스펙트를 만들었습니다.PostSharp에서 StopWatch를 사용하여 비동기 메서드의 성능 로깅이 정확하지 않습니다. MethodInterceptionAspect

그러나 예상대로 작동하지 않는 것 같습니다. sw.ElapsedMilliseconds은 항상 0 ~ 3 밀리 초입니다.

[Serializable] 
[AttributeUsage(AttributeTargets.Method)] 
public sealed class PerfLogAttribute : MethodInterceptionAspect 
{ 
    public override void OnInvoke(MethodInterceptionArgs args) 
    { 
     var sw = new Stopwatch(); 
     sw.Start(); 

     args.Proceed(); 

     sw.Stop(); 

     log.Debug(sw.ElapsedMilliseconds); 
    } 
} 

이런 식으로 사용 : @ Christian.K으로

[PerfLog] 
public async Task<bool> DoSomethingAsync() { 
    // Adding a delay to test (or call database async) 
    await Task.Delay(5000); 
    return true; 
} 
+0

Postsharp가 async/await에서 작동하는 것이 확실합니까? 그것은 단지 "기다리는 작업. 지연 (5000)"까지만 측정 할 수 있습니다. 인터넷 검색 "PostSharp 비동기 MethodInterceptor"는 관련성이있는 몇 가지 히트를 제공합니다. –

답변

1

는 말한다, 당신은 비동기 작업이 아닌 비동기 작업 자체를 인스턴스화되는 단지 방법을 차단하고 있습니다. 또한 작업을 수행하는 Method Interception을 사용하고 있지만 실제로 메소드 실행을 인터셉트 할 필요가 없기 때문에 필요한 패턴이 아닙니다. 메소드를 랩핑하면됩니다.

사례는 실제로 설명서에 http://doc.postsharp.net/async-methods#apply-to-state-machine으로 작성되어 있습니다.

프로파일 링 측면 :

[Serializable] 
public class ProfilingAttribute : OnMethodBoundaryAspect 
{ 
    public override void OnEntry(MethodExecutionArgs args) 
    { 
     Stopwatch sw = Stopwatch.StartNew(); 
     args.MethodExecutionTag = sw; 
    } 

    public override void OnExit(MethodExecutionArgs args) 
    { 
     Stopwatch sw = (Stopwatch) args.MethodExecutionTag; 
     sw.Stop(); 
     Console.WriteLine("Method {0} executed for {1}ms.", 
          args.Method.Name, sw.ElapsedMilliseconds); 
    } 
} 

응용 프로그램 :

[Profiling(ApplyToStateMachine = true)] 
public async Task TestProfiling() 
{ 
    await Task.Delay(1000); 
    Thread.Sleep(1000); 
} 

당신이 익스프레스 라이센스와 함께 사용하는 경우이 PostSharp 4.2에서 작동하지 않습니다,하지만 PostSharp 4.3에있는이 가능합니다 https://www.postsharp.net/downloads/postsharp-4.3에서 다운로드하십시오.

자세한 내용은 PostSharp.Samples.Profiling 예제 http://samples.postsharp.net/에서 찾을 수 있습니다.