Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / NetFx40 / System.Activities / System / Activities / Statements / ParallelForEach.cs / 1305376 / ParallelForEach.cs
//------------------------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- namespace System.Activities.Statements { using System.Activities; using System.Activities.Validation; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Windows.Markup; [ContentProperty("Body")] public sealed class ParallelForEach: NativeActivity { Variable hasCompleted; CompletionCallback onConditionComplete; public ParallelForEach() : base() { } [DefaultValue(null)] public ActivityAction Body { get; set; } [DefaultValue(null)] public Activity CompletionCondition { get; set; } [RequiredArgument] [DefaultValue(null)] public InArgument > Values { get; set; } protected override void CacheMetadata(NativeActivityMetadata metadata) { RuntimeArgument valuesArgument = new RuntimeArgument("Values", typeof(IEnumerable ), ArgumentDirection.In, true); metadata.Bind(this.Values, valuesArgument); metadata.SetArgumentsCollection(new Collection { valuesArgument }); // declare the CompletionCondition as a child if (this.CompletionCondition != null) { metadata.SetChildrenCollection(new Collection { this.CompletionCondition }); } // declare the hasCompleted variable if (this.CompletionCondition != null) { if (this.hasCompleted == null) { this.hasCompleted = new Variable (); } metadata.AddImplementationVariable(this.hasCompleted); } metadata.AddDelegate(this.Body); } protected override void Execute(NativeActivityContext context) { IEnumerable values = this.Values.Get(context); if (values == null) { throw FxTrace.Exception.AsError(new InvalidOperationException(SR.ParallelForEachRequiresNonNullValues(this.DisplayName))); } IEnumerator valueEnumerator = values.GetEnumerator(); CompletionCallback onBodyComplete = new CompletionCallback(OnBodyComplete); while (valueEnumerator.MoveNext()) { if (this.Body != null) { context.ScheduleAction(this.Body, valueEnumerator.Current, onBodyComplete); } } valueEnumerator.Dispose(); } void OnBodyComplete(NativeActivityContext context, ActivityInstance completedInstance) { // for the completion condition, we handle cancelation ourselves if (this.CompletionCondition != null && !this.hasCompleted.Get(context)) { if (completedInstance.State != ActivityInstanceState.Closed && context.IsCancellationRequested) { // If we hadn't completed before getting canceled // or one of our iteration of body cancels then we'll consider // ourself canceled. context.MarkCanceled(); this.hasCompleted.Set(context, true); } else { if (this.onConditionComplete == null) { this.onConditionComplete = new CompletionCallback (OnConditionComplete); } context.ScheduleActivity(CompletionCondition, this.onConditionComplete); } } } void OnConditionComplete(NativeActivityContext context, ActivityInstance completedInstance, bool result) { if (result) { context.CancelChildren(); this.hasCompleted.Set(context, true); } } } } // 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
- GrammarBuilderPhrase.cs
- DataBoundLiteralControl.cs
- JsonEnumDataContract.cs
- NonPrimarySelectionGlyph.cs
- WebControlToolBoxItem.cs
- FontWeight.cs
- FindCriteriaApril2005.cs
- validation.cs
- XmlDataSourceView.cs
- MessageQueueTransaction.cs
- Symbol.cs
- PropertyMetadata.cs
- VideoDrawing.cs
- TextChange.cs
- MemberPathMap.cs
- MetadataPropertyvalue.cs
- RowVisual.cs
- StrokeCollection.cs
- EventMemberCodeDomSerializer.cs
- PathFigureCollectionValueSerializer.cs
- SrgsElementFactory.cs
- LogConverter.cs
- DebugTrace.cs
- RangeValidator.cs
- AssemblyLoader.cs
- OracleRowUpdatingEventArgs.cs
- WebPartConnectionsDisconnectVerb.cs
- StopRoutingHandler.cs
- CodeTypeMember.cs
- PolyQuadraticBezierSegment.cs
- SQLSingleStorage.cs
- GridPatternIdentifiers.cs
- CodeRemoveEventStatement.cs
- AssemblyBuilder.cs
- DataBindingHandlerAttribute.cs
- InvalidDataException.cs
- DeferrableContentConverter.cs
- XsltSettings.cs
- CurrentChangingEventManager.cs
- GPStream.cs
- ColorContext.cs
- ButtonRenderer.cs
- MobileListItem.cs
- FacetEnabledSchemaElement.cs
- CodePrimitiveExpression.cs
- Bits.cs
- MarkupWriter.cs
- XmlSecureResolver.cs
- StringHelper.cs
- XmlDictionary.cs
- FieldNameLookup.cs
- WebPartAddingEventArgs.cs
- PartialTrustVisibleAssemblyCollection.cs
- WebPartManager.cs
- RuleProcessor.cs
- SqlBuffer.cs
- SessionIDManager.cs
- CmsInterop.cs
- CommandEventArgs.cs
- altserialization.cs
- HttpRawResponse.cs
- SqlBuilder.cs
- Marshal.cs
- ThreadAttributes.cs
- DataSourceProvider.cs
- MimeFormReflector.cs
- EUCJPEncoding.cs
- DiscoveryUtility.cs
- DbModificationCommandTree.cs
- MouseCaptureWithinProperty.cs
- ObjectKeyFrameCollection.cs
- FileInfo.cs
- ToolStripManager.cs
- CharacterShapingProperties.cs
- webeventbuffer.cs
- QueryableDataSourceView.cs
- CheckBox.cs
- InheritanceAttribute.cs
- ProfileService.cs
- _BufferOffsetSize.cs
- OdbcCommand.cs
- TransformGroup.cs
- DbProviderFactoriesConfigurationHandler.cs
- SuppressMergeCheckAttribute.cs
- DataFormats.cs
- MarshalByValueComponent.cs
- DataProviderNameConverter.cs
- MemberProjectionIndex.cs
- ParallelDesigner.cs
- Animatable.cs
- SqlExpressionNullability.cs
- FileUpload.cs
- ZipIOExtraFieldZip64Element.cs
- PageRequestManager.cs
- WorkflowClientDeliverMessageWrapper.cs
- DataSysAttribute.cs
- PersonalizationStateInfoCollection.cs
- RelationHandler.cs
- PanelDesigner.cs
- ServiceOperationParameter.cs