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
- HttpVersion.cs
- DoubleAnimationUsingKeyFrames.cs
- TransactionState.cs
- DataGridViewDataErrorEventArgs.cs
- ReadWriteSpinLock.cs
- ParameterReplacerVisitor.cs
- PolyQuadraticBezierSegment.cs
- ForwardPositionQuery.cs
- VisualStyleTypesAndProperties.cs
- TreeNodeStyle.cs
- Msec.cs
- DrawingServices.cs
- Schema.cs
- DSASignatureDeformatter.cs
- ImageIndexEditor.cs
- ToolboxComponentsCreatingEventArgs.cs
- __ConsoleStream.cs
- ReadOnlyAttribute.cs
- ApplicationManager.cs
- BaseConfigurationRecord.cs
- Menu.cs
- ToolStripDropDownItem.cs
- InstalledVoice.cs
- SoapDocumentServiceAttribute.cs
- TaskHelper.cs
- ItemAutomationPeer.cs
- ButtonFieldBase.cs
- XamlValidatingReader.cs
- ItemAutomationPeer.cs
- ListViewPagedDataSource.cs
- HMACMD5.cs
- ModelUIElement3D.cs
- Pair.cs
- NotImplementedException.cs
- querybuilder.cs
- ChangePasswordDesigner.cs
- HttpPostProtocolReflector.cs
- RemoteWebConfigurationHostServer.cs
- ScrollChrome.cs
- DecimalAnimationBase.cs
- ManipulationStartedEventArgs.cs
- UInt16Storage.cs
- DetailsViewUpdatedEventArgs.cs
- ObjectContextServiceProvider.cs
- RequestFactory.cs
- HandlerElementCollection.cs
- FontUnit.cs
- XmlEntityReference.cs
- SubMenuStyle.cs
- TableLayoutColumnStyleCollection.cs
- Char.cs
- TypeUtil.cs
- StreamWriter.cs
- MetadataArtifactLoaderFile.cs
- Int32Storage.cs
- WebRequest.cs
- _ConnectionGroup.cs
- LayoutTable.cs
- TemplateInstanceAttribute.cs
- SingleSelectRootGridEntry.cs
- Visual3D.cs
- StringValidatorAttribute.cs
- ListViewInsertEventArgs.cs
- SequentialWorkflowHeaderFooter.cs
- EventListener.cs
- PropertyKey.cs
- SapiRecoContext.cs
- AttributeTableBuilder.cs
- SQLGuid.cs
- ProofTokenCryptoHandle.cs
- ConfigurationValidatorBase.cs
- PrinterUnitConvert.cs
- MemberInfoSerializationHolder.cs
- SqlTransaction.cs
- GradientStop.cs
- DesignerActionVerbList.cs
- SelectionRangeConverter.cs
- DetailsViewPagerRow.cs
- MultiAsyncResult.cs
- SizeFConverter.cs
- DiscoveryEndpoint.cs
- SystemWebExtensionsSectionGroup.cs
- XMLUtil.cs
- RegexRunnerFactory.cs
- DataKeyPropertyAttribute.cs
- TransformProviderWrapper.cs
- WhitespaceRuleReader.cs
- ObsoleteAttribute.cs
- FontWeight.cs
- Hashtable.cs
- PropertyValueUIItem.cs
- TiffBitmapDecoder.cs
- DocumentPaginator.cs
- OdbcParameter.cs
- DataBindingHandlerAttribute.cs
- MeshGeometry3D.cs
- StateRuntime.cs
- Funcletizer.cs
- UriTemplateDispatchFormatter.cs
- StringToken.cs