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
- XmlObjectSerializerReadContextComplex.cs
- DefaultParameterValueAttribute.cs
- WebBrowserNavigatedEventHandler.cs
- Matrix.cs
- TabItem.cs
- CollectionChangeEventArgs.cs
- ErrorItem.cs
- OracleCommand.cs
- ValidationSummaryDesigner.cs
- OutputCacheModule.cs
- ToolStripSplitButton.cs
- MetadataArtifactLoaderFile.cs
- Size3D.cs
- ServiceParser.cs
- ReversePositionQuery.cs
- Queue.cs
- PerformanceCounterPermission.cs
- ConfigXmlReader.cs
- CustomGrammar.cs
- LocatorPart.cs
- BuildProvider.cs
- FamilyMap.cs
- UnicodeEncoding.cs
- CallContext.cs
- Variant.cs
- TextEndOfSegment.cs
- AssertHelper.cs
- DataSvcMapFileSerializer.cs
- UriTemplateTrieLocation.cs
- DivideByZeroException.cs
- ErrorProvider.cs
- ViewStateModeByIdAttribute.cs
- ApplicationDirectory.cs
- TextAction.cs
- SmiSettersStream.cs
- HttpCookie.cs
- Int16KeyFrameCollection.cs
- HandlerFactoryWrapper.cs
- ClientTarget.cs
- PropertyChangedEventManager.cs
- ViewManager.cs
- SqlClientFactory.cs
- Root.cs
- CustomError.cs
- _WebProxyDataBuilder.cs
- EventManager.cs
- NullableConverter.cs
- HtmlElement.cs
- Simplifier.cs
- SecurityDocument.cs
- HttpException.cs
- ListViewTableCell.cs
- MouseDevice.cs
- PropertyChangingEventArgs.cs
- XNodeNavigator.cs
- ProfileService.cs
- ReturnEventArgs.cs
- VectorValueSerializer.cs
- TypeSystem.cs
- ConfigurationManagerHelperFactory.cs
- MatrixCamera.cs
- UserPreferenceChangingEventArgs.cs
- RelationshipConverter.cs
- XmlReader.cs
- WorkflowQueue.cs
- EarlyBoundInfo.cs
- StrongName.cs
- FormsAuthenticationUserCollection.cs
- shaperfactoryquerycacheentry.cs
- HotSpot.cs
- ViewDesigner.cs
- PagesChangedEventArgs.cs
- ProcessThread.cs
- DispatcherObject.cs
- EncryptedReference.cs
- TextChange.cs
- PropertyNames.cs
- OverrideMode.cs
- BamlReader.cs
- SecurityTokenRequirement.cs
- KeyEventArgs.cs
- UmAlQuraCalendar.cs
- ScrollEventArgs.cs
- LeaseManager.cs
- SafeEventHandle.cs
- ContextCorrelationInitializer.cs
- TableHeaderCell.cs
- OLEDB_Util.cs
- DataGridViewRow.cs
- IndexOutOfRangeException.cs
- LinkedResourceCollection.cs
- MiniModule.cs
- FileLogRecordStream.cs
- DataView.cs
- TextTreeObjectNode.cs
- WebPartVerb.cs
- CommandField.cs
- UpDownBase.cs
- ValidationSettings.cs
- DelegateSerializationHolder.cs