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
- GridViewPageEventArgs.cs
- UserPreferenceChangingEventArgs.cs
- OdbcConnectionString.cs
- FacetChecker.cs
- DeviceOverridableAttribute.cs
- SQLDoubleStorage.cs
- SendDesigner.xaml.cs
- DrawingBrush.cs
- DataGridViewEditingControlShowingEventArgs.cs
- MdImport.cs
- DataGridCellAutomationPeer.cs
- DataMemberAttribute.cs
- GregorianCalendarHelper.cs
- SchemaAttDef.cs
- DataGridViewLayoutData.cs
- StyleSelector.cs
- RootProjectionNode.cs
- Control.cs
- DataMemberConverter.cs
- Graph.cs
- BoundPropertyEntry.cs
- VisualBrush.cs
- SignatureToken.cs
- FixedHighlight.cs
- DataControlImageButton.cs
- TextTreeTextNode.cs
- SafeSecurityHelper.cs
- arc.cs
- VBCodeProvider.cs
- webbrowsersite.cs
- XmlSchemaInferenceException.cs
- Ref.cs
- BitmapSource.cs
- CommandID.cs
- TimeSpanOrInfiniteConverter.cs
- Vector3DCollection.cs
- FactoryId.cs
- Model3D.cs
- GroupBoxRenderer.cs
- MetabaseServerConfig.cs
- SQLBytesStorage.cs
- DeviceFilterEditorDialog.cs
- NetworkInformationPermission.cs
- XomlSerializationHelpers.cs
- QilLoop.cs
- SHA256.cs
- DSASignatureFormatter.cs
- XmlCharacterData.cs
- Tracking.cs
- SelectedCellsCollection.cs
- SystemNetHelpers.cs
- TextServicesProperty.cs
- FormatSettings.cs
- NativeCppClassAttribute.cs
- TreeViewAutomationPeer.cs
- TextEditorTables.cs
- RichListBox.cs
- ControlBindingsCollection.cs
- ConcurrentQueue.cs
- CustomWebEventKey.cs
- DesignerVerb.cs
- mediapermission.cs
- InternalConfigSettingsFactory.cs
- CancelEventArgs.cs
- WebContext.cs
- EnumerableRowCollection.cs
- TransformDescriptor.cs
- WorkflowMarkupSerializer.cs
- bidPrivateBase.cs
- Help.cs
- DataGridPagingPage.cs
- AdCreatedEventArgs.cs
- NativeMethods.cs
- WrapPanel.cs
- XmlDocumentSerializer.cs
- JsonFormatGeneratorStatics.cs
- CodeSnippetExpression.cs
- FilterQueryOptionExpression.cs
- CTreeGenerator.cs
- DynamicScriptObject.cs
- RadioButton.cs
- StackSpiller.Bindings.cs
- DataPager.cs
- StackOverflowException.cs
- OrthographicCamera.cs
- Attributes.cs
- QueryExecutionOption.cs
- ProcessModule.cs
- X509CertificateEndpointIdentity.cs
- XPathDocumentIterator.cs
- TrustManagerPromptUI.cs
- PathGeometry.cs
- Clipboard.cs
- SHA384Managed.cs
- RangeValuePattern.cs
- XmlBinaryReader.cs
- ComplexBindingPropertiesAttribute.cs
- FontConverter.cs
- XmlSerializerFactory.cs
- DataGridViewRowContextMenuStripNeededEventArgs.cs