Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / NetFx40 / System.Activities / System / Activities / Statements / WorkflowCompensationBehavior.cs / 1305376 / WorkflowCompensationBehavior.cs
//---------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //--------------------------------------------------------------- namespace System.Activities.Statements { using System; using System.Collections.Generic; using System.Runtime; using System.Threading; using System.Collections.ObjectModel; sealed class WorkflowCompensationBehavior : NativeActivity { VariablecurrentCompensationToken; public WorkflowCompensationBehavior() : base() { currentCompensationToken = new Variable { Name = "currentCompensationToken", }; DefaultCompensation = new DefaultCompensation() { Target = new InArgument (this.currentCompensationToken), }; DefaultConfirmation = new DefaultConfirmation() { Target = new InArgument (this.currentCompensationToken), }; } Activity DefaultCompensation { get; set; } Activity DefaultConfirmation { get; set; } protected override bool CanInduceIdle { get { return true; } } protected override void CacheMetadata(NativeActivityMetadata metadata) { Fx.Assert(this.DefaultCompensation != null, "DefaultCompensation must be valid"); Fx.Assert(this.DefaultConfirmation != null, "DefaultConfirmation must be valid"); metadata.SetImplementationChildrenCollection( new Collection { this.DefaultCompensation, this.DefaultConfirmation }); metadata.SetImplementationVariablesCollection(new Collection { this.currentCompensationToken }); } protected override void Execute(NativeActivityContext context) { Bookmark mainRootCompleteBookmark = context.CreateBookmark(OnMainRootComplete, BookmarkOptions.NonBlocking); context.RegisterMainRootCompleteCallback(mainRootCompleteBookmark); CompensationExtension compensationExtension = context.GetExtension (); Fx.Assert(compensationExtension != null, "CompensationExtension must be valid"); compensationExtension.WorkflowCompensation = context.CreateBookmark(new BookmarkCallback(OnCompensate)); compensationExtension.WorkflowConfirmation = context.CreateBookmark(new BookmarkCallback(OnConfirm)); Fx.Assert(compensationExtension.WorkflowCompensationScheduled != null, "compensationExtension.WorkflowCompensationScheduled bookmark must be setup by now"); context.ResumeBookmark(compensationExtension.WorkflowCompensationScheduled, null); } protected override void Cancel(NativeActivityContext context) { context.CancelChildren(); } void OnMainRootComplete(NativeActivityContext context, Bookmark bookmark, object value) { CompensationExtension compensationExtension = context.GetExtension (); Fx.Assert(compensationExtension != null, "CompensationExtension must be valid"); CompensationTokenData rootHandle = compensationExtension.Get(CompensationToken.RootCompensationId); Fx.Assert(rootHandle != null, "rootToken must be valid"); ActivityInstanceState completionState = (ActivityInstanceState)value; if (completionState == ActivityInstanceState.Closed) { context.ResumeBookmark(compensationExtension.WorkflowConfirmation, new CompensationToken(rootHandle)); } else if (completionState == ActivityInstanceState.Canceled) { context.ResumeBookmark(compensationExtension.WorkflowCompensation, new CompensationToken(rootHandle)); } else if (completionState == ActivityInstanceState.Faulted) { // Do nothing. Neither Compensate nor Confirm. // Remove the bookmark to complete the WorkflowCompensationBehavior execution. context.RemoveBookmark(compensationExtension.WorkflowConfirmation); context.RemoveBookmark(compensationExtension.WorkflowCompensation); } } void OnCompensate(NativeActivityContext context, Bookmark bookmark, object value) { CompensationExtension compensationExtension = context.GetExtension (); Fx.Assert(compensationExtension != null, "CompensationExtension must be valid"); CompensationToken rootToken = (CompensationToken)value; Fx.Assert(rootToken != null, "rootToken must be passed"); this.currentCompensationToken.Set(context, rootToken); CompensationTokenData rootTokenData = compensationExtension.Get(rootToken.CompensationId); if (rootTokenData.ExecutionTracker.Count > 0) { context.ScheduleActivity(DefaultCompensation, new CompletionCallback(OnCompensationComplete)); } else { OnCompensationComplete(context, null); } } void OnCompensationComplete(NativeActivityContext context, ActivityInstance completedInstance) { // Remove bookmark.... have a cleanup book mark method... CompensationExtension compensationExtension = context.GetExtension (); Fx.Assert(compensationExtension != null, "CompensationExtension must be valid"); context.RemoveBookmark(compensationExtension.WorkflowConfirmation); } void OnConfirm(NativeActivityContext context, Bookmark bookmark, object value) { CompensationExtension compensationExtension = context.GetExtension (); Fx.Assert(compensationExtension != null, "CompensationExtension must be valid"); CompensationToken rootToken = (CompensationToken)value; Fx.Assert(rootToken != null, "rootToken must be passed"); this.currentCompensationToken.Set(context, rootToken); CompensationTokenData rootTokenData = compensationExtension.Get(rootToken.CompensationId); if (rootTokenData.ExecutionTracker.Count > 0) { context.ScheduleActivity(DefaultConfirmation, new CompletionCallback(OnConfirmationComplete)); } else { OnConfirmationComplete(context, null); } } void OnConfirmationComplete(NativeActivityContext context, ActivityInstance completedInstance) { CompensationExtension compensationExtension = context.GetExtension (); Fx.Assert(compensationExtension != null, "CompensationExtension must be valid"); context.RemoveBookmark(compensationExtension.WorkflowCompensation); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- FrameDimension.cs
- Simplifier.cs
- BoundsDrawingContextWalker.cs
- CodeArrayIndexerExpression.cs
- Button.cs
- TextPattern.cs
- SemaphoreFullException.cs
- DataSourceCache.cs
- AppLevelCompilationSectionCache.cs
- MessageSecurityOverMsmqElement.cs
- WCFModelStrings.Designer.cs
- OracleParameterCollection.cs
- ScriptControlManager.cs
- Bitmap.cs
- AnnotationHighlightLayer.cs
- PriorityRange.cs
- BitmapVisualManager.cs
- RepeaterDataBoundAdapter.cs
- CaseDesigner.xaml.cs
- SEHException.cs
- FirstMatchCodeGroup.cs
- WebScriptEnablingBehavior.cs
- ResourceDisplayNameAttribute.cs
- SchemaImporterExtensionElementCollection.cs
- Queue.cs
- WebServiceErrorEvent.cs
- GetIndexBinder.cs
- CodeTypeParameterCollection.cs
- BinaryExpression.cs
- InternalConfigEventArgs.cs
- DeadCharTextComposition.cs
- QuaternionAnimationUsingKeyFrames.cs
- PageAsyncTaskManager.cs
- ReadingWritingEntityEventArgs.cs
- RPIdentityRequirement.cs
- WebPartHelpVerb.cs
- ExtensionDataReader.cs
- TableStyle.cs
- CodeTypeReferenceCollection.cs
- OletxTransactionFormatter.cs
- HttpHandlerAction.cs
- _Rfc2616CacheValidators.cs
- DeclaredTypeElement.cs
- Vector3DAnimationBase.cs
- _SSPISessionCache.cs
- OleDbReferenceCollection.cs
- BindingGroup.cs
- DataGridViewMethods.cs
- AspNetHostingPermission.cs
- TypeToken.cs
- InheritedPropertyChangedEventArgs.cs
- ServerIdentity.cs
- MemberProjectedSlot.cs
- TraceListeners.cs
- ToolBarPanel.cs
- CheckBox.cs
- CqlIdentifiers.cs
- ManagedIStream.cs
- XmlEventCache.cs
- SchemaEntity.cs
- DataGridHeaderBorder.cs
- SctClaimSerializer.cs
- ApplicationProxyInternal.cs
- ListMarkerLine.cs
- XmlNodeChangedEventManager.cs
- DataGridViewColumnCollectionEditor.cs
- BaseCAMarshaler.cs
- EntityDataSourceWrapperPropertyDescriptor.cs
- UnknownWrapper.cs
- AndMessageFilter.cs
- EntityDesignerDataSourceView.cs
- AuthenticationManager.cs
- Gdiplus.cs
- ParagraphVisual.cs
- UTF7Encoding.cs
- ConnectionPointGlyph.cs
- SerializationSectionGroup.cs
- TextPenaltyModule.cs
- CmsUtils.cs
- Underline.cs
- ControlBindingsCollection.cs
- CacheModeValueSerializer.cs
- HtmlTableRowCollection.cs
- RequestQueryProcessor.cs
- HashCryptoHandle.cs
- XmlAttribute.cs
- CollectionExtensions.cs
- WmlValidationSummaryAdapter.cs
- Stopwatch.cs
- ChangesetResponse.cs
- DataTableNewRowEvent.cs
- AsyncPostBackErrorEventArgs.cs
- WindowsToolbar.cs
- SchemaConstraints.cs
- ServiceProviders.cs
- ConcurrentBag.cs
- InputLanguage.cs
- WorkflowServiceNamespace.cs
- XmlCountingReader.cs
- MediaContextNotificationWindow.cs