Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WF / RunTime / WorkflowStateRollbackService.cs / 1305376 / WorkflowStateRollbackService.cs
using System; using System.Collections.Generic; using System.Collections; using System.Diagnostics; using System.Reflection; using System.Text; using System.IO; using System.IO.Compression; using System.Transactions; using System.Workflow.ComponentModel; namespace System.Workflow.Runtime { internal sealed class WorkflowStateRollbackService { WorkflowExecutor workflowExecutor; // cache the revert back data MemoryStream clonedInstanceStateStream; Activity workflowDefinition = null; bool isInstanceStateRevertRequested = false; // revert back notification info string activityQualifiedName; int activityContextId; EventArgs callbackData; EventHandlercallbackHandler; bool suspendOnRevert; string suspendOnRevertInfo; Hashtable completedContextActivities = new Hashtable(); public WorkflowStateRollbackService(WorkflowExecutor workflowExecutor) { this.workflowExecutor = workflowExecutor; } internal bool IsInstanceStateRevertRequested { get { return this.isInstanceStateRevertRequested; } } internal void CheckpointInstanceState() { Debug.Assert(this.workflowExecutor.InstanceId != null, "instance id null at checkpoint time"); // serialize the instance state this.clonedInstanceStateStream = new MemoryStream(10240); this.workflowExecutor.RootActivity.Save(this.clonedInstanceStateStream); this.workflowDefinition = this.workflowExecutor.WorkflowDefinition; this.completedContextActivities = (Hashtable)this.workflowExecutor.CompletedContextActivities.Clone(); this.clonedInstanceStateStream.Position = 0; } internal void RequestRevertToCheckpointState(Activity currentActivity, EventHandler callbackHandler, EventArgs callbackData, bool suspendOnRevert, string suspendInfo) { if (this.clonedInstanceStateStream == null) throw new InvalidOperationException(ExecutionStringManager.InvalidRevertRequest); // cache the after revert information this.activityContextId = ContextActivityUtils.ContextId(ContextActivityUtils.ContextActivity(currentActivity)); this.activityQualifiedName = currentActivity.QualifiedName; this.callbackData = callbackData; this.callbackHandler = callbackHandler; this.suspendOnRevert = suspendOnRevert; this.suspendOnRevertInfo = suspendInfo; // ask scheduler to stop this.isInstanceStateRevertRequested = true; this.workflowExecutor.Scheduler.CanRun = false; } internal void DisposeCheckpointState() { this.clonedInstanceStateStream = null; } internal void RevertToCheckpointState() { Debug.Assert(this.clonedInstanceStateStream != null, "cloned instance-state stream null at restore time"); // deserialize only on first access Activity clonedRootActivity = null; this.clonedInstanceStateStream.Position = 0; using (RuntimeEnvironment runtimeEnv = new RuntimeEnvironment(this.workflowExecutor.WorkflowRuntime)) { clonedRootActivity = Activity.Load(this.clonedInstanceStateStream, (Activity)this.workflowDefinition); } Debug.Assert(clonedRootActivity != null); // // Set the trackingListenerBroker before initializing the executor so the tracking // runtime gets a reference to the correct object clonedRootActivity.SetValue(WorkflowExecutor.TrackingListenerBrokerProperty, workflowExecutor.RootActivity.GetValue(WorkflowExecutor.TrackingListenerBrokerProperty)); // create the new workflowExecutor WorkflowExecutor newWorkflowExecutor = new WorkflowExecutor(Guid.Empty); // use a dummy guid while swapping executors newWorkflowExecutor.Initialize(clonedRootActivity, this.workflowExecutor.WorkflowRuntime, this.workflowExecutor); // enqueue the activity notifier Activity activityContext = newWorkflowExecutor.GetContextActivityForId(this.activityContextId); Activity activity = activityContext.GetActivityByName(this.activityQualifiedName); using (new ServiceEnvironment(activity)) { using (newWorkflowExecutor.SetCurrentActivity(activity)) { using (ActivityExecutionContext executionContext = new ActivityExecutionContext(activity)) executionContext.Invoke (this.callbackHandler, this.callbackData); } } // // Push the batch item ordering id to the new instance newWorkflowExecutor.BatchCollection.WorkItemOrderId = this.workflowExecutor.BatchCollection.WorkItemOrderId; // replace pending batch items foreach (KeyValuePair
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- XmlSerializableServices.cs
- ScopelessEnumAttribute.cs
- FixedFindEngine.cs
- SourceLineInfo.cs
- PackagePartCollection.cs
- WebBrowserNavigatingEventHandler.cs
- RoleManagerSection.cs
- UpdateRecord.cs
- BackStopAuthenticationModule.cs
- ActivityValidator.cs
- HtmlFormWrapper.cs
- SqlDependency.cs
- Command.cs
- ForeignKeyConstraint.cs
- PersonalizationStateQuery.cs
- ComplexBindingPropertiesAttribute.cs
- BamlLocalizableResource.cs
- SiteMapNodeItem.cs
- DataObjectAttribute.cs
- ConvertersCollection.cs
- DataControlField.cs
- Reference.cs
- ImageListUtils.cs
- DesignTimeData.cs
- PathFigure.cs
- ClientBuildManagerCallback.cs
- UrlPropertyAttribute.cs
- InstancePersistenceCommand.cs
- TablePatternIdentifiers.cs
- SqlAggregateChecker.cs
- XamlTemplateSerializer.cs
- SafeIUnknown.cs
- ScriptResourceMapping.cs
- SynchronizedPool.cs
- SqlGenericUtil.cs
- CookieParameter.cs
- MembershipValidatePasswordEventArgs.cs
- EqualityComparer.cs
- ExtendedProperty.cs
- ServiceOperation.cs
- Signature.cs
- XamlInt32CollectionSerializer.cs
- InheritablePropertyChangeInfo.cs
- XmlSchemaSimpleContentRestriction.cs
- NamespaceImport.cs
- ButtonFieldBase.cs
- HandleExceptionArgs.cs
- RayMeshGeometry3DHitTestResult.cs
- CommonGetThemePartSize.cs
- BamlLocalizerErrorNotifyEventArgs.cs
- TypeFieldSchema.cs
- TextParagraphProperties.cs
- MinimizableAttributeTypeConverter.cs
- MILUtilities.cs
- _Rfc2616CacheValidators.cs
- DocumentXmlWriter.cs
- SqlResolver.cs
- Debug.cs
- BrowsableAttribute.cs
- DocComment.cs
- TextHidden.cs
- ListDictionary.cs
- HttpConfigurationContext.cs
- CompilerGlobalScopeAttribute.cs
- TemplateBindingExpressionConverter.cs
- DiffuseMaterial.cs
- OleDbReferenceCollection.cs
- mediaclock.cs
- Speller.cs
- VirtualPathProvider.cs
- SQLChars.cs
- OledbConnectionStringbuilder.cs
- StorageComplexPropertyMapping.cs
- TextBox.cs
- DefaultBindingPropertyAttribute.cs
- ToolStripLabel.cs
- SecurityAlgorithmSuiteConverter.cs
- MatrixTransform3D.cs
- WebResourceUtil.cs
- BitVector32.cs
- Predicate.cs
- XmlDataSourceNodeDescriptor.cs
- DesignerObjectListAdapter.cs
- GetFileNameResult.cs
- ProxyHelper.cs
- ObjectConverter.cs
- BinaryConverter.cs
- TypeBuilder.cs
- CellLabel.cs
- LinearGradientBrush.cs
- PeerNameRecord.cs
- VirtualDirectoryMapping.cs
- CustomTypeDescriptor.cs
- MailMessageEventArgs.cs
- ApplicationSecurityManager.cs
- ErrorHandler.cs
- AppDomainFactory.cs
- ScrollBarAutomationPeer.cs
- TextEncodedRawTextWriter.cs
- _UriTypeConverter.cs