Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / NetFx40 / System.Activities / System / Activities / Statements / ForEach.cs / 1305376 / ForEach.cs
//------------------------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- namespace System.Activities.Statements { using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Runtime; using System.Runtime.Serialization; using System.Windows.Markup; using System.Activities; using System.Activities.Validation; [ContentProperty("Body")] public sealed class ForEach: NativeActivity { Variable > valueEnumerator; CompletionCallback onChildComplete; public ForEach() : base() { this.valueEnumerator = new Variable >(); } [DefaultValue(null)] public ActivityAction Body { get; set; } [RequiredArgument] [DefaultValue(null)] public InArgument > Values { get; set; } CompletionCallback OnChildComplete { get { if (this.onChildComplete == null) { this.onChildComplete = new CompletionCallback(GetStateAndExecute); } return this.onChildComplete; } } protected override void CacheMetadata(NativeActivityMetadata metadata) { RuntimeArgument valuesArgument = new RuntimeArgument("Values", typeof(IEnumerable ), ArgumentDirection.In, true); metadata.Bind(this.Values, valuesArgument); metadata.AddArgument(valuesArgument); metadata.AddDelegate(this.Body); metadata.AddImplementationVariable(this.valueEnumerator); } protected override void Execute(NativeActivityContext context) { IEnumerable values = this.Values.Get(context); if (values == null) { throw FxTrace.Exception.AsError(new InvalidOperationException(SR.ForEachRequiresNonNullValues(this.DisplayName))); } IEnumerator valueEnumerator = values.GetEnumerator(); this.valueEnumerator.Set(context, valueEnumerator); if (this.Body == null || this.Body.Handler == null) { while (valueEnumerator.MoveNext()) { // do nothing }; valueEnumerator.Dispose(); return; } InternalExecute(context, null, valueEnumerator); } void GetStateAndExecute(NativeActivityContext context, ActivityInstance completedInstance) { IEnumerator valueEnumerator = this.valueEnumerator.Get(context); Fx.Assert(valueEnumerator != null, "GetStateAndExecute"); InternalExecute(context, completedInstance, valueEnumerator); } void InternalExecute(NativeActivityContext context, ActivityInstance completedInstance, IEnumerator valueEnumerator) { Fx.Assert(this.Body != null && this.Body.Handler != null, "Body and Body.Handler should not be null"); if (!valueEnumerator.MoveNext()) { if (completedInstance != null) { if (completedInstance.State == ActivityInstanceState.Canceled || (context.IsCancellationRequested && completedInstance.State == ActivityInstanceState.Faulted)) { context.MarkCanceled(); } } valueEnumerator.Dispose(); return; } // After making sure there is another value, let's check for cancelation if (context.IsCancellationRequested) { context.MarkCanceled(); valueEnumerator.Dispose(); return; } context.ScheduleAction(this.Body, valueEnumerator.Current, this.OnChildComplete); } } } // 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
- Expander.cs
- StaticResourceExtension.cs
- XmlNamedNodeMap.cs
- DataGridViewCellValidatingEventArgs.cs
- GroupLabel.cs
- TrackingProfileSerializer.cs
- SoapIgnoreAttribute.cs
- SectionUpdates.cs
- ErrorHandler.cs
- WindowsFormsHost.cs
- IBuiltInEvidence.cs
- FlowDocumentReader.cs
- EntityPropertyMappingAttribute.cs
- FacetValues.cs
- WindowsListViewItemStartMenu.cs
- EditingMode.cs
- ContentDisposition.cs
- ValidationSummary.cs
- EntityDataSourceDataSelectionPanel.cs
- PointKeyFrameCollection.cs
- EntryWrittenEventArgs.cs
- Point4DConverter.cs
- SafeCertificateContext.cs
- AdRotatorDesigner.cs
- Rect3DConverter.cs
- LinqToSqlWrapper.cs
- EnglishPluralizationService.cs
- ExpressionTextBox.xaml.cs
- DeviceContext2.cs
- WebPartEditorCancelVerb.cs
- SByteStorage.cs
- DataGridCell.cs
- StringAttributeCollection.cs
- EntityDesignerUtils.cs
- CharStorage.cs
- FixedPageStructure.cs
- UshortList2.cs
- PropertyValueUIItem.cs
- HtmlTernaryTree.cs
- TextTreeTextNode.cs
- HtmlToClrEventProxy.cs
- ElementAtQueryOperator.cs
- ImportRequest.cs
- TemplatedWizardStep.cs
- SecurityState.cs
- ItemCheckEvent.cs
- Container.cs
- KeyValueInternalCollection.cs
- SmtpLoginAuthenticationModule.cs
- EmptyCollection.cs
- XXXOnTypeBuilderInstantiation.cs
- MetadataPropertyvalue.cs
- CodeAttributeArgumentCollection.cs
- OperatingSystem.cs
- XmlFormatExtensionPrefixAttribute.cs
- DelegatingTypeDescriptionProvider.cs
- EdmRelationshipRoleAttribute.cs
- WebEvents.cs
- CodeDOMUtility.cs
- LinqDataSourceStatusEventArgs.cs
- assertwrapper.cs
- URLAttribute.cs
- RelativeSource.cs
- BitmapEffectDrawingContent.cs
- AstTree.cs
- Funcletizer.cs
- MultiAsyncResult.cs
- FixedDocumentPaginator.cs
- WebExceptionStatus.cs
- DSASignatureDeformatter.cs
- NotImplementedException.cs
- Compress.cs
- ButtonChrome.cs
- RuntimeHandles.cs
- XmlObjectSerializerReadContextComplexJson.cs
- EditorReuseAttribute.cs
- DrawingDrawingContext.cs
- Logging.cs
- CheckedPointers.cs
- XmlSchemaSet.cs
- ToolboxComponentsCreatedEventArgs.cs
- FormsAuthenticationCredentials.cs
- HtmlLabelAdapter.cs
- DataGridItem.cs
- ValueTypeFixupInfo.cs
- DrawToolTipEventArgs.cs
- SplineQuaternionKeyFrame.cs
- backend.cs
- QilLoop.cs
- basemetadatamappingvisitor.cs
- HtmlPanelAdapter.cs
- ChannelPoolSettingsElement.cs
- XmlNamespaceManager.cs
- DbParameterCollection.cs
- WindowsRegion.cs
- RangeBaseAutomationPeer.cs
- SmiEventSink.cs
- StrokeDescriptor.cs
- ProjectionCamera.cs
- OutputBuffer.cs