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
- SecurityUtils.cs
- ForeignConstraint.cs
- ValueOfAction.cs
- SqlDeflator.cs
- CultureInfo.cs
- TraceListener.cs
- Comparer.cs
- XdrBuilder.cs
- EntityContainerRelationshipSetEnd.cs
- OlePropertyStructs.cs
- DotExpr.cs
- SqlTriggerContext.cs
- Parser.cs
- MediaTimeline.cs
- WindowsIdentity.cs
- TextReturnReader.cs
- Registry.cs
- Action.cs
- StreamReader.cs
- RectangleGeometry.cs
- ISAPIApplicationHost.cs
- sortedlist.cs
- UncommonField.cs
- PropertyGeneratedEventArgs.cs
- DiscreteKeyFrames.cs
- TdsEnums.cs
- __Error.cs
- XmlWhitespace.cs
- TimelineClockCollection.cs
- ListViewItemMouseHoverEvent.cs
- CompilerResults.cs
- SystemFonts.cs
- ZipIOExtraFieldZip64Element.cs
- OutgoingWebRequestContext.cs
- DataError.cs
- BasicHttpBinding.cs
- EncoderReplacementFallback.cs
- MergeFailedEvent.cs
- SchemaImporterExtensionElement.cs
- ToolStripContentPanelRenderEventArgs.cs
- HtmlInputButton.cs
- DBSqlParser.cs
- XmlDataImplementation.cs
- RelatedView.cs
- DBConnection.cs
- Throw.cs
- Util.cs
- Validator.cs
- PermissionSetTriple.cs
- RSACryptoServiceProvider.cs
- TriggerBase.cs
- LexicalChunk.cs
- SelectorAutomationPeer.cs
- ConfigurationElement.cs
- DataServiceExpressionVisitor.cs
- CompilerScope.cs
- ChtmlCommandAdapter.cs
- ISAPIRuntime.cs
- ClientTargetCollection.cs
- PanelStyle.cs
- SystemMulticastIPAddressInformation.cs
- DeadCharTextComposition.cs
- VisualStateGroup.cs
- Hex.cs
- CodeLabeledStatement.cs
- FrugalList.cs
- StringWriter.cs
- PeerResolver.cs
- SqlFunctionAttribute.cs
- WebPartCancelEventArgs.cs
- ValidationEventArgs.cs
- HttpContextServiceHost.cs
- InvariantComparer.cs
- OpCodes.cs
- SplineQuaternionKeyFrame.cs
- XsltContext.cs
- HttpCachePolicy.cs
- CurrentTimeZone.cs
- VBCodeProvider.cs
- RegistryPermission.cs
- DataBindingList.cs
- TreeNodeSelectionProcessor.cs
- WebPageTraceListener.cs
- Stylesheet.cs
- BitmapScalingModeValidation.cs
- PageContentCollection.cs
- DefaultObjectMappingItemCollection.cs
- __Filters.cs
- CopyCodeAction.cs
- InfoCardSchemas.cs
- ItemCheckEvent.cs
- RuntimeCompatibilityAttribute.cs
- Selection.cs
- IndentTextWriter.cs
- SqlDataAdapter.cs
- UnmanagedHandle.cs
- EntityDataSourceMemberPath.cs
- WebResourceUtil.cs
- DataBindingList.cs
- TextMarkerSource.cs