2013-04-17 5 views
1

나는 추적 작업을 수행하기 위해 새 스레드를 호출하는 추적 참여자가 있습니다. 추적 작업은 결국이 작업을 수행합니다내 워크 플로를 추적 할 때 왜 이상한 타이밍이 발생합니까?

private static readonly ConcurrentDictionary<string, DateTime> TimingsDictionary = new ConcurrentDictionary<string, DateTime>(); 
private static readonly ConcurrentDictionary<Guid, DateTime> WorkflowTimingsDictionary = new ConcurrentDictionary<Guid, DateTime>(); 

private void TimeActivityRecord(TrackingRecord record) 
{ 
    var activityStateRecord = record as ActivityStateRecord; 
    if (activityStateRecord != null) 
    { 
     if (activityStateRecord.State == ActivityStates.Executing) 
     { 
      if (!TimingsDictionary.TryAdd(GetActivityId(activityStateRecord), activityStateRecord.EventTime)) 
      {} 
     } 

     if (activityStateRecord.State == ActivityStates.Closed 
      || activityStateRecord.State == ActivityStates.Faulted 
      || activityStateRecord.State == ActivityStates.Canceled) 
     { 
      DateTime startTime; 
      if (TimingsDictionary.TryRemove(GetActivityId(activityStateRecord), out startTime)) 
      { 
       timer.TimeAction("Executing workflow step " + activityStateRecord.Activity.Name, activityStateRecord.InstanceId, activityStateRecord.EventTime.Subtract(startTime)); 
      } 
     } 
    } 
} 

private void TimeWorkflowRecords(TrackingRecord record) 
{ 
    var workflowInstanceRecord = record as WorkflowInstanceRecord; 
    if (workflowInstanceRecord != null) 
    { 
     if (workflowInstanceRecord.State == WorkflowInstanceStates.Started) 
     {      
      if (!WorkflowTimingsDictionary.TryAdd(workflowInstanceRecord.InstanceId, workflowInstanceRecord.EventTime)) 
      {} 
     } 

     if (workflowInstanceRecord.State == WorkflowInstanceStates.Completed 
      || workflowInstanceRecord.State == WorkflowInstanceStates.Aborted 
      || workflowInstanceRecord.State == WorkflowInstanceStates.UnhandledException 
      || workflowInstanceRecord.State == WorkflowInstanceStates.Terminated 
      || workflowInstanceRecord.State == WorkflowInstanceStates.Canceled) 
     { 
      DateTime startTime; 
      if (WorkflowTimingsDictionary.TryRemove(workflowInstanceRecord.InstanceId, out startTime)) 
      { 
       timer.TimeAction("Executing workflow", workflowInstanceRecord.InstanceId, workflowInstanceRecord.EventTime.Subtract(startTime)); 
      } 
     } 
    } 
} 

전체 워크 플로우 시간과 구성 활동의 시간을 추적 할 수 있습니다. 그러나 워크 플로우 인스턴스 자체가 항상 가장 긴 활동보다 시간이 덜 걸리는 것처럼 이상한 결과를 얻습니다. 때로는 워크 플로우에서 62ms, 150ms, 125ms, 93ms, 17ms, 78ms를 사용하여 16ms 및 6 가지 작업을 수행합니다.

나는 뭔가 잘못하고 있니? 나는 아주 명백한 것을 놓치고 있어야만하는 것처럼 느껴진다.하지만 내 인생에서 그 무엇인지를 볼 수는 없다.

답변

0

물론 나는 바보 같은 짓을하고있었습니다. 나는 시간 범위에서 소요되는 시간을 기록하면 차라리 학교에 다시 나에게

timespan.TotalMilliseconds 

보다

timespan.Milliseconds 

을 사용했다. 아니면 잠을 자거나.