Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / NetFx40 / System.Activities / System / Activities / Runtime / CompletionCallbackWrapper.cs / 1305376 / CompletionCallbackWrapper.cs
//------------------------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- namespace System.Activities.Runtime { using System; using System.Collections.ObjectModel; using System.Runtime; using System.Runtime.Serialization; // can't add FuncCompletionCallbackWrappersince we don't know what to close the generic with [KnownType(typeof(ActivityCompletionCallbackWrapper))] [KnownType(typeof(DelegateCompletionCallbackWrapper))] [DataContract] abstract class CompletionCallbackWrapper : CallbackWrapper { static Type completionCallbackType = typeof(CompletionCallback); static Type[] completionCallbackParameters = new Type[] { typeof(NativeActivityContext), typeof(ActivityInstance) }; [DataMember(EmitDefaultValue = false)] bool checkForCancelation; [DataMember(EmitDefaultValue = false)] bool needsToGatherOutputs; protected CompletionCallbackWrapper(Delegate callback, ActivityInstance owningInstance) : base(callback, owningInstance) { } protected bool NeedsToGatherOutputs { get { return this.needsToGatherOutputs; } set { this.needsToGatherOutputs = value; } } public void CheckForCancelation() { this.checkForCancelation = true; } protected virtual void GatherOutputs(ActivityInstance completedInstance) { // No-op in the base class } internal WorkItem CreateWorkItem(ActivityInstance completedInstance, ActivityExecutor executor) { // We use the property to guard against the virtual method call // since we don't need it in the common case if (this.NeedsToGatherOutputs) { this.GatherOutputs(completedInstance); } CompletionWorkItem workItem; if (this.checkForCancelation) { workItem = new CompletionWithCancelationCheckWorkItem(this, completedInstance); } else { workItem = executor.CompletionWorkItemPool.Acquire(); workItem.Initialize(this, completedInstance); } if (completedInstance.InstanceMap != null) { completedInstance.InstanceMap.AddEntry(workItem); } return workItem; } protected internal abstract void Invoke(NativeActivityContext context, ActivityInstance completedInstance); [DataContract] public class CompletionWorkItem : ActivityExecutionWorkItem, ActivityInstanceMap.IActivityReference { [DataMember] CompletionCallbackWrapper callbackWrapper; [DataMember] ActivityInstance completedInstance; // Called by the Pool. public CompletionWorkItem() { this.IsPooled = true; } // Only used by non-pooled base classes. protected CompletionWorkItem(CompletionCallbackWrapper callbackWrapper, ActivityInstance completedInstance) : base(callbackWrapper.ActivityInstance) { this.callbackWrapper = callbackWrapper; this.completedInstance = completedInstance; } protected ActivityInstance CompletedInstance { get { return this.completedInstance; } } public void Initialize(CompletionCallbackWrapper callbackWrapper, ActivityInstance completedInstance) { base.Reinitialize(callbackWrapper.ActivityInstance); this.callbackWrapper = callbackWrapper; this.completedInstance = completedInstance; } protected override void ReleaseToPool(ActivityExecutor executor) { base.ClearForReuse(); this.callbackWrapper = null; this.completedInstance = null; executor.CompletionWorkItemPool.Release(this); } public override void TraceCompleted() { if (TD.CompleteCompletionWorkItemIsEnabled()) { TD.CompleteCompletionWorkItem(this.ActivityInstance.Activity.GetType().ToString(), this.ActivityInstance.Activity.DisplayName, this.ActivityInstance.Id, this.completedInstance.Activity.GetType().ToString(), this.completedInstance.Activity.DisplayName, this.completedInstance.Id); } } public override void TraceScheduled() { if (TD.ScheduleCompletionWorkItemIsEnabled()) { TD.ScheduleCompletionWorkItem(this.ActivityInstance.Activity.GetType().ToString(), this.ActivityInstance.Activity.DisplayName, this.ActivityInstance.Id, this.completedInstance.Activity.GetType().ToString(), this.completedInstance.Activity.DisplayName, this.completedInstance.Id); } } public override void TraceStarting() { if (TD.StartCompletionWorkItemIsEnabled()) { TD.StartCompletionWorkItem(this.ActivityInstance.Activity.GetType().ToString(), this.ActivityInstance.Activity.DisplayName, this.ActivityInstance.Id, this.completedInstance.Activity.GetType().ToString(), this.completedInstance.Activity.DisplayName, this.completedInstance.Id); } } public override bool Execute(ActivityExecutor executor, BookmarkManager bookmarkManager) { NativeActivityContext context = executor.NativeActivityContextPool.Acquire(); Fx.Assert(this.completedInstance.Activity != null, "Activity definition should always be associated with an activity instance."); try { context.Initialize(this.ActivityInstance, executor, bookmarkManager); this.callbackWrapper.Invoke(context, this.completedInstance); } catch (Exception e) { if (Fx.IsFatal(e)) { throw; } this.ExceptionToPropagate = e; } finally { context.Dispose(); executor.NativeActivityContextPool.Release(context); if (this.ActivityInstance.InstanceMap != null) { this.ActivityInstance.InstanceMap.RemoveEntry(this); } } return true; } Activity ActivityInstanceMap.IActivityReference.Activity { get { return this.completedInstance.Activity; } } void ActivityInstanceMap.IActivityReference.Load(Activity activity, ActivityInstanceMap instanceMap) { if (this.completedInstance.Activity == null) { ((ActivityInstanceMap.IActivityReference)this.completedInstance).Load(activity, instanceMap); } } } [DataContract] class CompletionWithCancelationCheckWorkItem : CompletionWorkItem { public CompletionWithCancelationCheckWorkItem(CompletionCallbackWrapper callbackWrapper, ActivityInstance completedInstance) : base(callbackWrapper, completedInstance) { } public override bool Execute(ActivityExecutor executor, BookmarkManager bookmarkManager) { if (this.CompletedInstance.State != ActivityInstanceState.Closed && this.ActivityInstance.IsPerformingDefaultCancelation) { this.ActivityInstance.MarkCanceled(); } return base.Execute(executor, bookmarkManager); } } } } // 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
- TypeRefElement.cs
- SharedStream.cs
- CollectionBuilder.cs
- MetadataUtilsSmi.cs
- WorkflowInstanceExtensionCollection.cs
- jithelpers.cs
- DataGridViewLayoutData.cs
- RowUpdatingEventArgs.cs
- TextServicesProperty.cs
- UInt64.cs
- MouseDevice.cs
- CodeArgumentReferenceExpression.cs
- Ipv6Element.cs
- MemberPath.cs
- FormatConvertedBitmap.cs
- CompilationAssemblyInstallComponent.cs
- ResourceExpression.cs
- TemplateField.cs
- Int64Animation.cs
- APCustomTypeDescriptor.cs
- FontFamilyValueSerializer.cs
- SerializationSectionGroup.cs
- OperatorExpressions.cs
- Icon.cs
- StylusSystemGestureEventArgs.cs
- StylusPointPropertyInfo.cs
- IsolatedStorageException.cs
- SEHException.cs
- CurrentTimeZone.cs
- HitTestParameters.cs
- DuplexChannelFactory.cs
- MembershipSection.cs
- Int32AnimationUsingKeyFrames.cs
- X509Certificate2.cs
- FrameworkContentElement.cs
- PageAsyncTask.cs
- CatalogPartCollection.cs
- ParentQuery.cs
- MimeFormReflector.cs
- XPathMultyIterator.cs
- ApplicationSecurityManager.cs
- XhtmlConformanceSection.cs
- SecurityRuntime.cs
- ConstraintEnumerator.cs
- ListBoxItem.cs
- UpDownEvent.cs
- CapacityStreamGeometryContext.cs
- WindowsUserNameSecurityTokenAuthenticator.cs
- _ListenerAsyncResult.cs
- DockProviderWrapper.cs
- EntityDataSourceConfigureObjectContext.cs
- IteratorFilter.cs
- AmbientProperties.cs
- __ComObject.cs
- HScrollBar.cs
- Light.cs
- VoiceInfo.cs
- VisualStateManager.cs
- DebugController.cs
- AppSettingsExpressionBuilder.cs
- FontSizeConverter.cs
- UpdateException.cs
- WindowsAuthenticationModule.cs
- UtilityExtension.cs
- ExceptionRoutedEventArgs.cs
- COAUTHINFO.cs
- ChtmlTextWriter.cs
- Composition.cs
- BufferedStream2.cs
- DataProtectionSecurityStateEncoder.cs
- MetadataItemEmitter.cs
- Formatter.cs
- CachedFontFamily.cs
- TypeForwardedToAttribute.cs
- LinqDataSourceStatusEventArgs.cs
- RootBrowserWindowAutomationPeer.cs
- SettingsBase.cs
- GeneralTransform2DTo3DTo2D.cs
- Point.cs
- BitmapEffectInputData.cs
- MessageQueuePermission.cs
- PropertyMappingExceptionEventArgs.cs
- MarginsConverter.cs
- WindowsGraphicsCacheManager.cs
- DropSource.cs
- SQLCharsStorage.cs
- TailCallAnalyzer.cs
- WorkflowDesignerMessageFilter.cs
- XmlSchemaValidationException.cs
- PageHandlerFactory.cs
- ThrowHelper.cs
- Image.cs
- XmlText.cs
- CultureTable.cs
- ClassicBorderDecorator.cs
- MissingManifestResourceException.cs
- DoubleAnimation.cs
- PasswordRecovery.cs
- ValidationService.cs
- XmlFormatReaderGenerator.cs