Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WF / Activities / Parallel.cs / 1305376 / Parallel.cs
namespace System.Workflow.Activities { #region Imports using System; using System.Text; using System.Reflection; using System.Collections; using System.CodeDom; using System.ComponentModel; using System.ComponentModel.Design; using System.Drawing.Design; using System.Drawing; using System.Workflow.ComponentModel; using System.Workflow.ComponentModel.Design; using System.Runtime.Serialization; using System.Collections.Generic; using System.Workflow.ComponentModel.Compiler; using System.Workflow.Runtime.DebugEngine; using System.Workflow.Activities.Common; #endregion [SRDescription(SR.ParallelActivityDescription)] [ToolboxItem(typeof(ParallelToolboxItem))] [ToolboxBitmap(typeof(ParallelActivity), "Resources.Parallel.png")] [Designer(typeof(ParallelDesigner), typeof(IDesigner))] [ActivityValidator(typeof(ParallelValidator))] [SRCategory(SR.Standard)] [WorkflowDebuggerSteppingAttribute(WorkflowDebuggerSteppingOption.Concurrent)] public sealed class ParallelActivity: CompositeActivity, IActivityEventListener{ #region Constructors public ParallelActivity() { } public ParallelActivity(string name) : base(name) { } #endregion #region Protected Methods protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext) { if (executionContext == null) throw new ArgumentNullException("executionContext"); //Tomark that execute method is called for this activity. this.IsExecuting = true; for (int i = 0; i < this.EnabledActivities.Count; ++i) { Activity childActivity = this.EnabledActivities[i]; childActivity.RegisterForStatusChange(Activity.ClosedEvent, this); executionContext.ExecuteActivity(childActivity); } return (this.EnabledActivities.Count == 0) ? ActivityExecutionStatus.Closed : ActivityExecutionStatus.Executing; } protected override ActivityExecutionStatus Cancel(ActivityExecutionContext executionContext) { if (executionContext == null) throw new ArgumentNullException("executionContext"); bool canCloseNow = true; for (int i = 0; i < this.EnabledActivities.Count; ++i) { Activity childActivity = this.EnabledActivities[i]; if (childActivity.ExecutionStatus == ActivityExecutionStatus.Executing) { executionContext.CancelActivity(childActivity); canCloseNow = false; } else if (childActivity.ExecutionStatus == ActivityExecutionStatus.Canceling || childActivity.ExecutionStatus == ActivityExecutionStatus.Faulting) { canCloseNow = false; } } return canCloseNow ? ActivityExecutionStatus.Closed : ActivityExecutionStatus.Canceling; } protected override void OnClosed(IServiceProvider provider) { base.RemoveProperty(ParallelActivity.IsExecutingProperty); } protected override void OnActivityChangeAdd(ActivityExecutionContext executionContext, Activity addedActivity) { if (executionContext == null) throw new ArgumentNullException("executionContext"); if (addedActivity == null) throw new ArgumentNullException("addedActivity"); ParallelActivity parallel = executionContext.Activity as ParallelActivity; if (parallel.ExecutionStatus == ActivityExecutionStatus.Executing && parallel.IsExecuting) { addedActivity.RegisterForStatusChange(Activity.ClosedEvent, this); executionContext.ExecuteActivity(addedActivity); } } protected override void OnActivityChangeRemove(ActivityExecutionContext rootExecutionContext, Activity removedActivity) { } protected override void OnWorkflowChangesCompleted(ActivityExecutionContext executionContext) { base.OnWorkflowChangesCompleted(executionContext); if (this.IsExecuting) { bool canCloseNow = true; for (int i = 0; i < this.EnabledActivities.Count; ++i) { Activity childActivity = this.EnabledActivities[i]; if (childActivity.ExecutionStatus != ActivityExecutionStatus.Closed) { canCloseNow = false; break; } } if (canCloseNow) executionContext.CloseActivity(); } } #endregion #region IActivityEventListener Members void IActivityEventListener .OnEvent(object sender, ActivityExecutionStatusChangedEventArgs e) { if (sender == null) throw new ArgumentNullException("sender"); if (e == null) throw new ArgumentNullException("e"); ActivityExecutionContext context = sender as ActivityExecutionContext; if (context == null) throw new ArgumentException(SR.Error_SenderMustBeActivityExecutionContext, "sender"); ParallelActivity parallel = context.Activity as ParallelActivity; e.Activity.UnregisterForStatusChange(Activity.ClosedEvent, this); bool canCloseNow = true; for (int i = 0; i < parallel.EnabledActivities.Count; ++i) { Activity childActivity = parallel.EnabledActivities[i]; if (!(childActivity.ExecutionStatus == ActivityExecutionStatus.Initialized || childActivity.ExecutionStatus == ActivityExecutionStatus.Closed)) { canCloseNow = false; break; } } if (canCloseNow) context.CloseActivity(); } #endregion #region Runtime Specific Data //Runtime Properties static DependencyProperty IsExecutingProperty = DependencyProperty.Register("IsExecuting", typeof(bool), typeof(ParallelActivity), new PropertyMetadata(false)); private bool IsExecuting { get { return (bool)base.GetValue(IsExecutingProperty); } set { base.SetValue(IsExecutingProperty, value); } } #endregion } #region Validator internal sealed class ParallelValidator : CompositeActivityValidator { public override ValidationErrorCollection Validate(ValidationManager manager, object obj) { ValidationErrorCollection validationErrors = base.Validate(manager, obj); ParallelActivity parallel = obj as ParallelActivity; if (parallel == null) throw new ArgumentException(SR.GetString(SR.Error_UnexpectedArgumentType, typeof(ParallelActivity).FullName), "obj"); // Validate number of children if (parallel.EnabledActivities.Count < 2) validationErrors.Add(new ValidationError(SR.GetString(SR.Error_ParallelLessThanTwoChildren), ErrorNumbers.Error_ParallelLessThanTwoChildren)); bool notAllSequence = false; foreach(Activity activity in parallel.EnabledActivities) { if(activity.GetType() != typeof(SequenceActivity)) { notAllSequence = true; } } // Validate that all child activities are sequence activities. if (notAllSequence) validationErrors.Add(new ValidationError(SR.GetString(SR.Error_ParallelNotAllSequence), ErrorNumbers.Error_ParallelNotAllSequence)); return validationErrors; } } #endregion } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. namespace System.Workflow.Activities { #region Imports using System; using System.Text; using System.Reflection; using System.Collections; using System.CodeDom; using System.ComponentModel; using System.ComponentModel.Design; using System.Drawing.Design; using System.Drawing; using System.Workflow.ComponentModel; using System.Workflow.ComponentModel.Design; using System.Runtime.Serialization; using System.Collections.Generic; using System.Workflow.ComponentModel.Compiler; using System.Workflow.Runtime.DebugEngine; using System.Workflow.Activities.Common; #endregion [SRDescription(SR.ParallelActivityDescription)] [ToolboxItem(typeof(ParallelToolboxItem))] [ToolboxBitmap(typeof(ParallelActivity), "Resources.Parallel.png")] [Designer(typeof(ParallelDesigner), typeof(IDesigner))] [ActivityValidator(typeof(ParallelValidator))] [SRCategory(SR.Standard)] [WorkflowDebuggerSteppingAttribute(WorkflowDebuggerSteppingOption.Concurrent)] public sealed class ParallelActivity: CompositeActivity, IActivityEventListener { #region Constructors public ParallelActivity() { } public ParallelActivity(string name) : base(name) { } #endregion #region Protected Methods protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext) { if (executionContext == null) throw new ArgumentNullException("executionContext"); //Tomark that execute method is called for this activity. this.IsExecuting = true; for (int i = 0; i < this.EnabledActivities.Count; ++i) { Activity childActivity = this.EnabledActivities[i]; childActivity.RegisterForStatusChange(Activity.ClosedEvent, this); executionContext.ExecuteActivity(childActivity); } return (this.EnabledActivities.Count == 0) ? ActivityExecutionStatus.Closed : ActivityExecutionStatus.Executing; } protected override ActivityExecutionStatus Cancel(ActivityExecutionContext executionContext) { if (executionContext == null) throw new ArgumentNullException("executionContext"); bool canCloseNow = true; for (int i = 0; i < this.EnabledActivities.Count; ++i) { Activity childActivity = this.EnabledActivities[i]; if (childActivity.ExecutionStatus == ActivityExecutionStatus.Executing) { executionContext.CancelActivity(childActivity); canCloseNow = false; } else if (childActivity.ExecutionStatus == ActivityExecutionStatus.Canceling || childActivity.ExecutionStatus == ActivityExecutionStatus.Faulting) { canCloseNow = false; } } return canCloseNow ? ActivityExecutionStatus.Closed : ActivityExecutionStatus.Canceling; } protected override void OnClosed(IServiceProvider provider) { base.RemoveProperty(ParallelActivity.IsExecutingProperty); } protected override void OnActivityChangeAdd(ActivityExecutionContext executionContext, Activity addedActivity) { if (executionContext == null) throw new ArgumentNullException("executionContext"); if (addedActivity == null) throw new ArgumentNullException("addedActivity"); ParallelActivity parallel = executionContext.Activity as ParallelActivity; if (parallel.ExecutionStatus == ActivityExecutionStatus.Executing && parallel.IsExecuting) { addedActivity.RegisterForStatusChange(Activity.ClosedEvent, this); executionContext.ExecuteActivity(addedActivity); } } protected override void OnActivityChangeRemove(ActivityExecutionContext rootExecutionContext, Activity removedActivity) { } protected override void OnWorkflowChangesCompleted(ActivityExecutionContext executionContext) { base.OnWorkflowChangesCompleted(executionContext); if (this.IsExecuting) { bool canCloseNow = true; for (int i = 0; i < this.EnabledActivities.Count; ++i) { Activity childActivity = this.EnabledActivities[i]; if (childActivity.ExecutionStatus != ActivityExecutionStatus.Closed) { canCloseNow = false; break; } } if (canCloseNow) executionContext.CloseActivity(); } } #endregion #region IActivityEventListener Members void IActivityEventListener .OnEvent(object sender, ActivityExecutionStatusChangedEventArgs e) { if (sender == null) throw new ArgumentNullException("sender"); if (e == null) throw new ArgumentNullException("e"); ActivityExecutionContext context = sender as ActivityExecutionContext; if (context == null) throw new ArgumentException(SR.Error_SenderMustBeActivityExecutionContext, "sender"); ParallelActivity parallel = context.Activity as ParallelActivity; e.Activity.UnregisterForStatusChange(Activity.ClosedEvent, this); bool canCloseNow = true; for (int i = 0; i < parallel.EnabledActivities.Count; ++i) { Activity childActivity = parallel.EnabledActivities[i]; if (!(childActivity.ExecutionStatus == ActivityExecutionStatus.Initialized || childActivity.ExecutionStatus == ActivityExecutionStatus.Closed)) { canCloseNow = false; break; } } if (canCloseNow) context.CloseActivity(); } #endregion #region Runtime Specific Data //Runtime Properties static DependencyProperty IsExecutingProperty = DependencyProperty.Register("IsExecuting", typeof(bool), typeof(ParallelActivity), new PropertyMetadata(false)); private bool IsExecuting { get { return (bool)base.GetValue(IsExecutingProperty); } set { base.SetValue(IsExecutingProperty, value); } } #endregion } #region Validator internal sealed class ParallelValidator : CompositeActivityValidator { public override ValidationErrorCollection Validate(ValidationManager manager, object obj) { ValidationErrorCollection validationErrors = base.Validate(manager, obj); ParallelActivity parallel = obj as ParallelActivity; if (parallel == null) throw new ArgumentException(SR.GetString(SR.Error_UnexpectedArgumentType, typeof(ParallelActivity).FullName), "obj"); // Validate number of children if (parallel.EnabledActivities.Count < 2) validationErrors.Add(new ValidationError(SR.GetString(SR.Error_ParallelLessThanTwoChildren), ErrorNumbers.Error_ParallelLessThanTwoChildren)); bool notAllSequence = false; foreach(Activity activity in parallel.EnabledActivities) { if(activity.GetType() != typeof(SequenceActivity)) { notAllSequence = true; } } // Validate that all child activities are sequence activities. if (notAllSequence) validationErrors.Add(new ValidationError(SR.GetString(SR.Error_ParallelNotAllSequence), ErrorNumbers.Error_ParallelNotAllSequence)); return validationErrors; } } #endregion } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- MethodBody.cs
- QueryOutputWriter.cs
- SizeAnimation.cs
- ToolStripLabel.cs
- DataGridViewLinkColumn.cs
- TransformDescriptor.cs
- WebBrowser.cs
- SamlSubject.cs
- Int16AnimationUsingKeyFrames.cs
- AsyncOperation.cs
- FormsAuthenticationTicket.cs
- ContentTextAutomationPeer.cs
- GridViewEditEventArgs.cs
- WorkflowOperationErrorHandler.cs
- CompiledRegexRunnerFactory.cs
- AuthenticationModuleElement.cs
- Util.cs
- GridEntryCollection.cs
- Int16Storage.cs
- DataSourceHelper.cs
- AutomationPropertyInfo.cs
- WhitespaceRuleReader.cs
- StringConverter.cs
- DataFormat.cs
- TimelineGroup.cs
- WindowsListViewItemCheckBox.cs
- DataServiceSaveChangesEventArgs.cs
- MeshGeometry3D.cs
- LazyTextWriterCreator.cs
- WebBrowsableAttribute.cs
- InheritedPropertyChangedEventArgs.cs
- DbProviderFactoriesConfigurationHandler.cs
- EncodingInfo.cs
- FormCollection.cs
- LoginName.cs
- RegexWriter.cs
- ValidateNames.cs
- EventProviderClassic.cs
- BaseCodePageEncoding.cs
- EntitySet.cs
- DataComponentMethodGenerator.cs
- COM2Properties.cs
- DtdParser.cs
- BackStopAuthenticationModule.cs
- FunctionQuery.cs
- JoinCqlBlock.cs
- SessionStateUtil.cs
- ButtonField.cs
- Content.cs
- TypographyProperties.cs
- EventProxy.cs
- BufferModesCollection.cs
- filewebrequest.cs
- CustomError.cs
- ResourceDefaultValueAttribute.cs
- TagPrefixInfo.cs
- QuerySettings.cs
- TextOnlyOutput.cs
- DrawListViewSubItemEventArgs.cs
- HScrollProperties.cs
- ListMarkerSourceInfo.cs
- DPTypeDescriptorContext.cs
- SiteMapNodeItemEventArgs.cs
- ExternalException.cs
- DecoderReplacementFallback.cs
- MarkupWriter.cs
- RC2.cs
- _TransmitFileOverlappedAsyncResult.cs
- EmptyElement.cs
- NonVisualControlAttribute.cs
- LogicalExpressionEditor.cs
- GCHandleCookieTable.cs
- OrderByLifter.cs
- CompilationSection.cs
- DetectRunnableInstancesTask.cs
- DataGridItemEventArgs.cs
- CollectionType.cs
- SiteMapHierarchicalDataSourceView.cs
- BitmapMetadataBlob.cs
- InternalConfigHost.cs
- SqlDependency.cs
- UTF7Encoding.cs
- CurrentTimeZone.cs
- NameValueSectionHandler.cs
- CellParagraph.cs
- XmlSchemaExporter.cs
- OutputScopeManager.cs
- NavigateEvent.cs
- EventLogException.cs
- UnaryQueryOperator.cs
- TypeUtils.cs
- ObjectDataSourceView.cs
- AutomationAttributeInfo.cs
- PlanCompilerUtil.cs
- XPathNodeInfoAtom.cs
- HttpListenerPrefixCollection.cs
- FileSystemWatcher.cs
- HyperLinkStyle.cs
- PostBackTrigger.cs
- ExpressionNormalizer.cs