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
- UserPersonalizationStateInfo.cs
- VerificationException.cs
- Tablet.cs
- BitmapEncoder.cs
- PathSegment.cs
- ToolStripSplitButton.cs
- SafeNativeMemoryHandle.cs
- SqlUserDefinedAggregateAttribute.cs
- RIPEMD160Managed.cs
- ScrollViewer.cs
- PlacementWorkspace.cs
- FormsAuthenticationModule.cs
- Number.cs
- IntranetCredentialPolicy.cs
- XmlQualifiedName.cs
- Base64Decoder.cs
- XomlDesignerLoader.cs
- SqlTriggerAttribute.cs
- Currency.cs
- InvalidAsynchronousStateException.cs
- FileCodeGroup.cs
- ImpersonationContext.cs
- OwnerDrawPropertyBag.cs
- JsonFormatMapping.cs
- XmlSchemaDocumentation.cs
- Point3DCollection.cs
- sqlstateclientmanager.cs
- WebPart.cs
- XslAst.cs
- HttpResponse.cs
- ProxyHwnd.cs
- SqlTopReducer.cs
- SystemIPGlobalProperties.cs
- SrgsElementFactory.cs
- DataContractSerializerServiceBehavior.cs
- StreamUpgradeAcceptor.cs
- Propagator.Evaluator.cs
- RangeExpression.cs
- ResourcePool.cs
- X509ChainPolicy.cs
- XmlSortKey.cs
- WriteableBitmap.cs
- ValueType.cs
- TableLayout.cs
- ColorTranslator.cs
- AssociationTypeEmitter.cs
- TryCatch.cs
- InternalControlCollection.cs
- _LazyAsyncResult.cs
- StylusPointPropertyInfo.cs
- LabelEditEvent.cs
- _NTAuthentication.cs
- WebFormsRootDesigner.cs
- AxDesigner.cs
- CollectionViewSource.cs
- DataMemberAttribute.cs
- DataGridViewComboBoxEditingControl.cs
- HandleCollector.cs
- ExpressionVisitorHelpers.cs
- Cursors.cs
- TemplateManager.cs
- MimePart.cs
- BitmapEffectOutputConnector.cs
- DataSourceCollectionBase.cs
- SelectionItemProviderWrapper.cs
- SafeProcessHandle.cs
- SafeLocalMemHandle.cs
- mediapermission.cs
- CodeDelegateInvokeExpression.cs
- _ContextAwareResult.cs
- PreloadedPackages.cs
- ImageSourceConverter.cs
- ChildTable.cs
- DbModificationClause.cs
- ScrollItemProviderWrapper.cs
- dataprotectionpermission.cs
- HyperlinkAutomationPeer.cs
- Signature.cs
- DescendantBaseQuery.cs
- RequestBringIntoViewEventArgs.cs
- DbLambda.cs
- JournalNavigationScope.cs
- TypeEnumerableViewSchema.cs
- CodeActivityContext.cs
- WeakEventManager.cs
- AnchorEditor.cs
- SchemaSetCompiler.cs
- ToolStripDropDownClosingEventArgs.cs
- ChannelDemuxer.cs
- MsmqNonTransactedPoisonHandler.cs
- SevenBitStream.cs
- MatrixTransform3D.cs
- CAGDesigner.cs
- Transform3DGroup.cs
- PageThemeCodeDomTreeGenerator.cs
- PrtCap_Base.cs
- ScriptBehaviorDescriptor.cs
- TemplateParser.cs
- WindowsFormsHostPropertyMap.cs
- SafeFindHandle.cs