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
- XsltInput.cs
- OdbcParameterCollection.cs
- Model3DGroup.cs
- ScaleTransform.cs
- Variant.cs
- DataGridHeaderBorder.cs
- AssemblyNameProxy.cs
- _LocalDataStoreMgr.cs
- WeakReferenceKey.cs
- HostExecutionContextManager.cs
- NativeMethodsCLR.cs
- FutureFactory.cs
- SecuritySessionServerSettings.cs
- FileLogRecordStream.cs
- UDPClient.cs
- BlurBitmapEffect.cs
- OutputChannelBinder.cs
- RequestCacheValidator.cs
- StandardMenuStripVerb.cs
- DrawingContextWalker.cs
- IndividualDeviceConfig.cs
- DescriptionAttribute.cs
- TableSectionStyle.cs
- AlignmentXValidation.cs
- VerificationException.cs
- ScrollItemProviderWrapper.cs
- parserscommon.cs
- InputManager.cs
- AesCryptoServiceProvider.cs
- Trace.cs
- RectangleF.cs
- RangeValidator.cs
- OutputCacheProfile.cs
- Overlapped.cs
- RemotingHelper.cs
- RelationshipSet.cs
- MappingMetadataHelper.cs
- SymbolEqualComparer.cs
- HttpListenerException.cs
- TextStore.cs
- ValidationHelper.cs
- FrameSecurityDescriptor.cs
- ServiceRoute.cs
- ByteKeyFrameCollection.cs
- X509ThumbprintKeyIdentifierClause.cs
- ContentValidator.cs
- HMACSHA512.cs
- InputBinder.cs
- XmlEnumAttribute.cs
- OracleConnectionStringBuilder.cs
- UdpDiscoveryEndpoint.cs
- FixedHyperLink.cs
- HMACMD5.cs
- EventLogStatus.cs
- LineServices.cs
- Decorator.cs
- TagPrefixAttribute.cs
- ImageSource.cs
- NativeMethods.cs
- DataSourceConverter.cs
- EmptyCollection.cs
- Resources.Designer.cs
- ScrollPatternIdentifiers.cs
- Interlocked.cs
- ProxyWebPart.cs
- BaseInfoTable.cs
- CompilationLock.cs
- RelationHandler.cs
- ObfuscateAssemblyAttribute.cs
- DetailsViewPageEventArgs.cs
- FormsAuthentication.cs
- RemotingConfigParser.cs
- ManagementBaseObject.cs
- FloatSumAggregationOperator.cs
- Cursor.cs
- Int32Rect.cs
- DataGridViewRowConverter.cs
- TypeDescriptionProvider.cs
- HtmlInputImage.cs
- WindowsStatic.cs
- oledbmetadatacollectionnames.cs
- DefaultExpression.cs
- InputBuffer.cs
- Command.cs
- TemplateControlBuildProvider.cs
- Wizard.cs
- TypeDescriptionProviderAttribute.cs
- ExcCanonicalXml.cs
- DeobfuscatingStream.cs
- SoapInteropTypes.cs
- HashSetDebugView.cs
- ListSourceHelper.cs
- CacheEntry.cs
- WebPartConnectionsConfigureVerb.cs
- ApplicationException.cs
- TouchEventArgs.cs
- SqlClientMetaDataCollectionNames.cs
- CharKeyFrameCollection.cs
- CapacityStreamGeometryContext.cs
- WmlPhoneCallAdapter.cs