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
- FormsAuthentication.cs
- CodeAttributeDeclaration.cs
- Wildcard.cs
- RijndaelManaged.cs
- StyleSheetRefUrlEditor.cs
- XmlChoiceIdentifierAttribute.cs
- WebControlAdapter.cs
- Visual3D.cs
- EmbossBitmapEffect.cs
- DesignOnlyAttribute.cs
- ControlsConfig.cs
- TreeNode.cs
- ArgumentOutOfRangeException.cs
- CoTaskMemHandle.cs
- streamingZipPartStream.cs
- TripleDESCryptoServiceProvider.cs
- InstanceOwnerQueryResult.cs
- ConfigurationManagerInternal.cs
- TraceHandlerErrorFormatter.cs
- FixedSOMTableRow.cs
- GeneralTransform3DCollection.cs
- DataSourceXmlTextReader.cs
- ApplicationServiceHelper.cs
- SingleTagSectionHandler.cs
- ListBoxChrome.cs
- Profiler.cs
- GridViewColumnHeader.cs
- PathFigureCollection.cs
- SparseMemoryStream.cs
- RadioButtonPopupAdapter.cs
- GroupDescription.cs
- WmlCalendarAdapter.cs
- ToolStripPanelSelectionGlyph.cs
- ModelProperty.cs
- HttpHandlerAction.cs
- ServiceKnownTypeAttribute.cs
- IMembershipProvider.cs
- CqlParserHelpers.cs
- KeyInfo.cs
- ListViewSortEventArgs.cs
- ObjectStateEntryOriginalDbUpdatableDataRecord.cs
- StoreItemCollection.cs
- OleDbCommandBuilder.cs
- XdrBuilder.cs
- WebPartDisplayModeCancelEventArgs.cs
- ReadOnlyTernaryTree.cs
- XmlNamedNodeMap.cs
- ScriptingProfileServiceSection.cs
- PageVisual.cs
- FloaterBaseParaClient.cs
- commandenforcer.cs
- AssemblyUtil.cs
- SQLByte.cs
- AppModelKnownContentFactory.cs
- AxisAngleRotation3D.cs
- ModelToObjectValueConverter.cs
- ContractUtils.cs
- NativeConfigurationLoader.cs
- QueryActivatableWorkflowsCommand.cs
- NameValueCollection.cs
- ResourceDescriptionAttribute.cs
- NameValuePermission.cs
- WmlTextViewAdapter.cs
- TrackingLocationCollection.cs
- XmlQualifiedName.cs
- WebMessageEncodingElement.cs
- DebugControllerThread.cs
- HwndMouseInputProvider.cs
- DiscoveryUtility.cs
- ClientScriptManager.cs
- Subordinate.cs
- SqlClientMetaDataCollectionNames.cs
- SafeArchiveContext.cs
- KeyEvent.cs
- UntypedNullExpression.cs
- WindowsSpinner.cs
- SecurityRuntime.cs
- PriorityChain.cs
- StoragePropertyMapping.cs
- bidPrivateBase.cs
- SingleKeyFrameCollection.cs
- DataGridViewHeaderCell.cs
- InputLanguageCollection.cs
- PackWebRequest.cs
- ListItemConverter.cs
- ProviderConnectionPoint.cs
- IssuedTokenClientBehaviorsElementCollection.cs
- TransactionsSectionGroup.cs
- PageOrientation.cs
- _DigestClient.cs
- CodeTypeParameterCollection.cs
- CreateUserWizardDesigner.cs
- DNS.cs
- PagerSettings.cs
- LinqDataSourceView.cs
- WinEventHandler.cs
- webeventbuffer.cs
- Library.cs
- ToolTipService.cs
- PersonalizationProvider.cs