private void StartActivityExecutionTracking(Activity activity) { lock (s_activitiesStackSync) { _executingActivitiesStack.Push(activity.Name); } var eventArgs = new WorkflowExecutionContextEventArgs(this, activity); ActivityExecutionStarting.RaiseEvent(this, eventArgs); if (!Tracking) return; if (_restoring) { if (_trackingActivitiesStack[_restoredActivitiesCount] != activity.Name) { var msg = string.Format( "Ошибка при восстановлении выполнения потока работ: " + "действие {0}, которое начинает выполнение, отличается от действия {1}, " + "которое, согласно информации в контексте, должно начать выполнение", activity.Name, _trackingActivitiesStack[_restoredActivitiesCount]); throw new ActivityExecutionException(msg, activity, this); } _restoredActivitiesCount++; if (_restoredActivitiesCount == _trackingActivitiesStack.Count) _restoring = false; return; } _trackingActivitiesStack.Push(activity.Name); ExecutionContextChanged.RaiseEvent(this, eventArgs); }
private void EndActivityExecutionTracking(Activity activity) { lock (s_activitiesStackSync) { SafePopFromStack(_executingActivitiesStack, activity); } var eventArgs = new WorkflowExecutionContextEventArgs(this, activity); ActivityExecutionFinished.RaiseEvent(this, eventArgs); if (!Tracking) return; if (_restoring) return; SafePopFromStack(_trackingActivitiesStack, activity); ExecutionContextChanged.RaiseEvent(this, eventArgs); }