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
- XsdCachingReader.cs
- securitycriticaldata.cs
- XmlDataSource.cs
- EncryptedPackageFilter.cs
- ErrorFormatterPage.cs
- SHA256.cs
- PageCodeDomTreeGenerator.cs
- ExpressionTable.cs
- ProtectedConfigurationSection.cs
- DeclaredTypeValidatorAttribute.cs
- Missing.cs
- StringValueSerializer.cs
- ListView.cs
- DetailsViewInsertedEventArgs.cs
- ProcessThread.cs
- DBSchemaTable.cs
- FixUp.cs
- ServiceSettingsResponseInfo.cs
- _NetRes.cs
- InstanceNotReadyException.cs
- Parameter.cs
- CommandBindingCollection.cs
- InternalRelationshipCollection.cs
- ReferenceEqualityComparer.cs
- TreeView.cs
- SubMenuStyleCollection.cs
- ObjectStateFormatter.cs
- EntityEntry.cs
- UTF32Encoding.cs
- ColumnMap.cs
- Rijndael.cs
- FormsAuthenticationUser.cs
- ComponentEvent.cs
- DataGridViewAutoSizeColumnModeEventArgs.cs
- SystemIPAddressInformation.cs
- DesignerProperties.cs
- FontStyle.cs
- TextTreeUndoUnit.cs
- TextBreakpoint.cs
- MouseButtonEventArgs.cs
- OutKeywords.cs
- SmiEventSink_Default.cs
- ObjectQuery.cs
- ProxyWebPartManagerDesigner.cs
- Visitors.cs
- TemplateKey.cs
- StylusButtonCollection.cs
- XmlSchemaObjectTable.cs
- MdiWindowListStrip.cs
- SchemaCollectionCompiler.cs
- XPathChildIterator.cs
- WebPartActionVerb.cs
- ArrayConverter.cs
- XmlSchemaDatatype.cs
- DirectoryNotFoundException.cs
- LinkedList.cs
- EntitySet.cs
- AssemblyGen.cs
- QilTernary.cs
- Timer.cs
- _ListenerAsyncResult.cs
- SqlDataSourceCache.cs
- EllipticalNodeOperations.cs
- SourceLineInfo.cs
- SimpleApplicationHost.cs
- Localizer.cs
- ColorMatrix.cs
- SqlDataSourceFilteringEventArgs.cs
- WebPartDescription.cs
- Dump.cs
- ResXDataNode.cs
- PrimitiveXmlSerializers.cs
- Journaling.cs
- BindingsCollection.cs
- FontWeightConverter.cs
- ResourceManager.cs
- CodeGenerator.cs
- FixedSchema.cs
- ThicknessKeyFrameCollection.cs
- GridViewColumnHeader.cs
- UnSafeCharBuffer.cs
- AnnouncementInnerClient11.cs
- ExpressionBindingCollection.cs
- XmlSchemaGroup.cs
- IndexedEnumerable.cs
- CollectionConverter.cs
- CodeTypeReferenceExpression.cs
- DateTimeConverter2.cs
- DrawListViewItemEventArgs.cs
- OLEDB_Util.cs
- SiteMapNodeItem.cs
- NullReferenceException.cs
- AbandonedMutexException.cs
- ExceptionRoutedEventArgs.cs
- EventLogger.cs
- GridView.cs
- QilChoice.cs
- RunClient.cs
- DoubleAnimationBase.cs
- ClockGroup.cs