private bool OnStage1Complete(IAsyncResult lastResult, WorkflowApplication application, bool isStillSync) { if (lastResult != null) { application.Controller.EndFlushTrackingRecords(lastResult); } IAsyncResult result = null; if (application.RaiseIdleEvent()) { if (application.Controller.IsPersistable && application.persistenceManager != null) { var persistableIdleHandler = application.PersistableIdle; if (persistableIdleHandler != null) { var action = PersistableIdleAction.None; application.handlerThreadId = Thread.CurrentThread.ManagedThreadId; try { application.isInHandler = true; action = persistableIdleHandler(new WorkflowApplicationIdleEventArgs(application)); } finally { application.isInHandler = false; } if (TD.WorkflowApplicationPersistableIdleIsEnabled()) { TD.WorkflowApplicationPersistableIdle(application.Id.ToString(), action.ToString()); } if (action != PersistableIdleAction.None) { var operation = PersistenceOperation.Unload; if (action == PersistableIdleAction.Persist) { operation = PersistenceOperation.Save; } else if (action != PersistableIdleAction.Unload) { throw FxTrace.Exception.AsError(new InvalidOperationException(SR.InvalidIdleAction)); } application.EventData.NextCallback = this.Stage2Callback; result = application.BeginInternalPersist(operation, ActivityDefaults.InternalSaveTimeout, true, EventFrameCallback, application.EventData); if (!result.CompletedSynchronously) { return(false); } } } else { // Trace the default action if (TD.WorkflowApplicationPersistableIdleIsEnabled()) { TD.WorkflowApplicationPersistableIdle(application.Id.ToString(), PersistableIdleAction.None.ToString()); } } } } return(this.OnStage2Complete(result, application, isStillSync)); }