Code:
/ 4.0 / 4.0 / untmp / 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.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- PDBReader.cs
- NativeMethodsOther.cs
- ContainerParagraph.cs
- RelationshipEnd.cs
- LOSFormatter.cs
- XmlDataSourceView.cs
- _ServiceNameStore.cs
- RangeValuePatternIdentifiers.cs
- XmlWrappingWriter.cs
- StyleBamlRecordReader.cs
- OperationAbortedException.cs
- ExtendedPropertyInfo.cs
- COM2TypeInfoProcessor.cs
- Delegate.cs
- TextCompositionManager.cs
- Memoizer.cs
- ResourceContainer.cs
- ManipulationVelocities.cs
- WebReferencesBuildProvider.cs
- TdsRecordBufferSetter.cs
- StorageBasedPackageProperties.cs
- CountdownEvent.cs
- ZipIOCentralDirectoryFileHeader.cs
- AuthenticatingEventArgs.cs
- CopyOnWriteList.cs
- AccessibleObject.cs
- XPathNodePointer.cs
- XamlTreeBuilder.cs
- SQLDoubleStorage.cs
- BuilderPropertyEntry.cs
- ProjectionCamera.cs
- exports.cs
- BuildDependencySet.cs
- TransformCollection.cs
- HwndAppCommandInputProvider.cs
- ParameterCollection.cs
- QueryReaderSettings.cs
- WS2007FederationHttpBinding.cs
- PersonalizationStateInfo.cs
- DiffuseMaterial.cs
- DbDataSourceEnumerator.cs
- DependencyPropertyKind.cs
- PointLight.cs
- UserControlAutomationPeer.cs
- SqlProfileProvider.cs
- HttpCachePolicy.cs
- HuffmanTree.cs
- WpfMemberInvoker.cs
- RuntimeArgumentHandle.cs
- InsufficientMemoryException.cs
- EntityDataSourceContextCreatingEventArgs.cs
- BooleanAnimationBase.cs
- SQLConvert.cs
- CanExecuteRoutedEventArgs.cs
- LongCountAggregationOperator.cs
- TemplateAction.cs
- XmlSchemaObjectCollection.cs
- SqlServer2KCompatibilityCheck.cs
- XmlSchemaCompilationSettings.cs
- RepeaterItemCollection.cs
- ToolStripItem.cs
- SplitterEvent.cs
- DrawingDrawingContext.cs
- Empty.cs
- NameValuePair.cs
- OracleConnectionFactory.cs
- SoapFormatterSinks.cs
- XPathQilFactory.cs
- XmlParserContext.cs
- AuthenticationModuleElementCollection.cs
- XmlEventCache.cs
- CheckBoxField.cs
- DoubleIndependentAnimationStorage.cs
- NativeMethodsCLR.cs
- MetabaseServerConfig.cs
- RootBrowserWindow.cs
- RbTree.cs
- NonVisualControlAttribute.cs
- NativeMethods.cs
- StylusTip.cs
- DataListCommandEventArgs.cs
- StringValueSerializer.cs
- ContextMenuAutomationPeer.cs
- wmiprovider.cs
- InvokePattern.cs
- WindowsFormsHostPropertyMap.cs
- PowerStatus.cs
- SqlLiftIndependentRowExpressions.cs
- LinearGradientBrush.cs
- SliderAutomationPeer.cs
- Stack.cs
- EventLogger.cs
- HuffModule.cs
- PropertyStore.cs
- AssociationEndMember.cs
- PartialTrustVisibleAssembly.cs
- Token.cs
- StructuredType.cs
- SelectionBorderGlyph.cs
- SecurityTokenContainer.cs