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));
            }
        }
    }
}

ワークフロー全体の時間と構成されたアクティビティの時間を追跡します。ただし、ワークフロー インスタンス自体が常に最も長いアクティビティよりも時間がかからないように見えるという奇妙な結果が得られます。ワークフローに 16 ミリ秒かかり、ワークフロー内の 6 つのアクティビティに 625 ミリ秒、150 ミリ秒、125 ミリ秒、93 ミリ秒、17 ミリ秒、78 ミリ秒かかることがあります。

私は何か非常に間違ったことをしていますか?私は何か非常に明白な何かを見逃しているに違いないと感じていますが、私の人生ではそれが何であるかを見ることはできません.

4

1 に答える 1