2009-10-26 4 views
2

비동기 메서드를 실행하는 데 걸리는 시간을 측정 할 수 있기를 원합니다.비동기 호출이 실제로 시작되는시기를 아는 방법은 무엇입니까?

메서드를 동 기적으로 호출하면 다음 코드를 실행하고 MyMethod 메서드를 사용한 정확한 시간을 가져옵니다.

for (int i = 0; i < 5000; i++) { 
    stopWatches[i].Start(); 
    webService.MyMethod(new Request()); 
    stopWatches[i].Stop(); 
} 

MyMethod를 비동기 적으로 실행하도록 코드를 변경 했으므로 이제 내 코드는 다음과 같습니다.

var callback = new Action<IAsyncResult>(ar => { 
    int i = (int)ar.AsyncState; 

    try { 
     var response = webService.EndMyMethod(ar); 
     stopWatches[i].Stop(); 
    } 
} 

for (int i = 0; i < 5000; i++) { 
    webService.BeginMyMethod(new Request(), new AsyncCallback(callback), i); 
    stopWatches[i].Start(); 
} 

문제는 스톱워치가 더 이상 요청을 실행하는 데 필요한 시간을 측정하지 않는다는 것입니다. 스레드 풀 대기열에 요청이 입력 된 후 호출이 끝날 때까지의 시간을 측정합니다. 그래서 나는 시간이 빨라지면서 스톱워치 목록을 보게된다.

스톱워치를 어떻게 수정합니까? 요청이 언제 시작되는지 정확하게 알 수있는 방법이 있습니까?

감사합니다.

업데이트 : MyMethod 구현을 변경할 수 없습니다.

+1

왜 MyMethod의 구현을 변경할 수 없습니까? –

답변

1

웹 서비스 클래스가 아닌 BeginTimedMyMethod 메서드를 만듭니다. BeginTimedMyMethod 구현에서 비동기 적으로 호출되는 MyMethod 대신 중간 메서드를 호출하십시오. 스톱워치를 시작한 다음 MyMethod를 호출하십시오.

void BeginTimedMyMethod(...) 
{ 
    //create delegate with StartMethod as target 
    //Invoke StartMethod delegate 
} 

void StartTimedMethod(Request request) 
{ 
    stopWatches[i].Start(); 
    webservice.MyMethod(request); 
} 
0

정확하게 측정을 수행하려고합니까? 실제 작업이 완료 될 때까지 작업을 요청할 때까지 소요되는 실제 시간을 측정하는 것입니다. 그것은 말이되는 것 같습니다. 코드 전환 전후에 실제 요청 대기 시간을 측정하고 있습니다.

0

mymethod 클래스 주위에 aspect를 설정하려고하는 것처럼 들리는 것 같습니다. 가장 쉬운 방법은 PostSharp와 같은 AOP 프레임 워크를 사용하는 것입니다. 당신은 당신이

public class MyService 
{ 
    [MyStopWatchContext] 
    public void SomeServiceMethod() 
    { ... 
    } 
} 

이 당신의 방법으로 클래스 내부에 그런

public class MyStopWatchContext 
{ 
    Stopwatch _watch = new Stopwatch(); 

    public void OnMethodEntry() 
    { 
     _watch.Start(); 
    } 

    public void OnMethodExit() 
    { 
     _watch.End(); 
     Debug.Print(_watch.Duration); 
    } 
} 

의 라인을 따라 뭔가를 만드는 것이이는 방법을 수정할 필요없이 메소드에 그 부분을 묶어 허용합니다. 그러나 여전히 코드를 다시 컴파일 할 수 있어야합니다. 따라서이 클래스는 외부 서비스에 대한 프록시 일 뿐이며 프록시 된 호출의 해당 측면을 앉을 수 있어야하므로 제어 할 수 없습니다.

관련 문제