2016-11-22 6 views
3

코드 전체에서 특정 작업을 실행하기위한 시간 측정을 시작합니다. Stopwatch 클래스를 사용하면 작업이 완료되지만 Stopwatch는 단일 함수 또는 코드 블록 내에서 시간을 측정하는 데는 효과적이지만 응용 프로그램의 여러 지점 (여러 네임 스페이스) 간에는 시간 측정에 효과적이지 않습니다. 궁극적으로 Application Insights와 같은 실제 원격 측정 서비스를 통합 할 예정이지만, 현재로서는 시간을 원하고 로그에 기록합니다. 내 스톱워치 게터/세터C# 스레드가 여러 네임 스페이스에 걸쳐 경과 시간을 캡처하는 데 안전하고 효과적인 방법을 찾고 있습니다.

namespace MyApp.Application.Contracts.Core.References 
public class StopwatchReference 
{ 
    /// <summary> 
    /// The Timer is used to accurately measure the elapsed milliseconds of specific tasks 
    /// </summary> 
    public Stopwatch Timer { get; set; } 
} 

내 참조 클래스는 나는 방법 A

 var startTime = new StopwatchReference(); 
     startTime.Timer.Start(); 

우리는 많은 다른 네임 스페이스에서 여러 방법을 통해 실행 타이밍되는 코드에서 시계를 시작합니다. 우리가 Method B라고 부를 것입니다. 타이머의 정확한 인스턴스를 정지시키는 적절한 방법은 무엇입니까? 시스템에는 동시에 많은 사용자가 같은 전화를 걸기 때문에 스레드 안전이 가장 중요합니다.

다른 방법에 대한 제안은 열려 있습니다. 미리 감사드립니다!

+0

* 실제로 * 수행중인 작업을 알지 못해도 안전하게 수행하는 방법에 대해서는 언급 할 수 없습니다. – Servy

+0

모든 코드를 통해 StopwatchReference에 대한 참조를 삽입 할 수 있습니다. – gobes

답변

2

코드에서 잘 정의 된 위치에서 작업을 시작한다고 가정하면 시간을 측정하는 것으로 충분합니다.

public void StartTask(Action task) 
{ 
    var sw = new Stopwatch(); 
    task(); 
    sw.Stop(); 
    ... 
} 

주어진 작업에서 어떤 메서드와 네임 스페이스가 사용되는지는 중요하지 않습니다.

당신이 선택한 방법의 로그 시작/종료에 쓸 NLog 같은 로깅 라이브러리를 사용할 수 있습니다 mamy 스레드에서 시간을 측정하려면

UPDATE. NLog는 또한 스레드 ID를 기록합니다. 게다가 당신은 세션 ID 나 사용자 ID와 같은 것을 로그인해야만 항목을 상관시킬 수 있습니다.

코드를 너무 많이 수정하고 싶지 않다면 애스펙트 지향 프로그래밍을 사용하여 애플리케이션에 로깅을 주입 할 수 있습니다.

Finnally, 정규 expendressions 또는 일부 데이터 분석 도구를 사용하여 로그를 수동으로 분석 할 수 있습니다. 내 마음에 처음 온 것은 키 바나입니다.

+0

그러나 문제의 전체 전제는 그것이 사실이 아니라는 것입니다. 그는 한 곳에서 그것을 시작하고 다른 곳에서, 다른 실에서 끝납니다. – Servy