Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / ServiceModel / System / ServiceModel / Channels / DeliveryStrategy.cs / 1 / DeliveryStrategy.cs
//------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------- namespace System.ServiceModel.Channels { using System; using System.Collections.Generic; using System.ServiceModel.Diagnostics; using System.Threading; abstract class DeliveryStrategy: IDisposable where ItemType : class, IDisposable { InputQueueChannel channel; ItemDequeuedCallback dequeueCallback; int quota; public DeliveryStrategy(InputQueueChannel channel, int quota) { if (quota <= 0) { DiagnosticUtility.DebugAssert("Argument quota must be positive."); throw DiagnosticUtility.ExceptionUtility.ThrowHelperInternal(false); } this.channel = channel; this.quota = quota; } protected InputQueueChannel Channel { get { return this.channel; } } public ItemDequeuedCallback DequeueCallback { get { return this.dequeueCallback; } set { this.dequeueCallback = value; } } public abstract int EnqueuedCount { get; } protected int Quota { get { return this.quota; } } public abstract bool CanEnqueue(Int64 sequenceNumber); public virtual void Dispose() { } public abstract bool Enqueue(ItemType item, Int64 sequenceNumber); } class OrderedDeliveryStrategy : DeliveryStrategy where ItemType : class, IDisposable { bool isEnqueueInOrder; Dictionary items; WaitCallback onDispatchCallback; Int64 windowStart; public OrderedDeliveryStrategy( InputQueueChannel channel, int quota, bool isEnqueueInOrder) : base(channel, quota) { this.isEnqueueInOrder = isEnqueueInOrder; this.items = new Dictionary (); this.windowStart = 1; } public override int EnqueuedCount { get { return this.Channel.InternalPendingItems + this.items.Count; } } WaitCallback OnDispatchCallback { get { if (this.onDispatchCallback == null) { this.onDispatchCallback = this.OnDispatch; } return this.onDispatchCallback; } } public override bool CanEnqueue(long sequenceNumber) { if (this.EnqueuedCount >= this.Quota) { return false; } if (this.isEnqueueInOrder && (sequenceNumber > this.windowStart)) { return false; } return (this.Channel.InternalPendingItems + sequenceNumber - this.windowStart < this.Quota); } public override bool Enqueue(ItemType item, long sequenceNumber) { if (sequenceNumber > this.windowStart) { this.items.Add(sequenceNumber, item); return false; } this.windowStart++; while (this.items.ContainsKey(this.windowStart)) { if (this.Channel.EnqueueWithoutDispatch(item, this.DequeueCallback)) { IOThreadScheduler.ScheduleCallback(this.OnDispatchCallback, null); } item = this.items[this.windowStart]; this.items.Remove(this.windowStart); this.windowStart++; } return this.Channel.EnqueueWithoutDispatch(item, this.DequeueCallback); } static void DisposeItems(Dictionary .Enumerator items) { if (items.MoveNext()) { using (ItemType item = items.Current.Value) { DisposeItems(items); } } } public override void Dispose() { DisposeItems(this.items.GetEnumerator()); this.items.Clear(); base.Dispose(); } void OnDispatch(object state) { this.Channel.Dispatch(); } } class UnorderedDeliveryStrategy : DeliveryStrategy where ItemType : class, IDisposable { public UnorderedDeliveryStrategy(InputQueueChannel channel, int quota) : base(channel, quota) { } public override int EnqueuedCount { get { return this.Channel.InternalPendingItems; } } public override bool CanEnqueue(Int64 sequenceNumber) { return (this.EnqueuedCount < this.Quota); } public override bool Enqueue(ItemType item, long sequenceNumber) { return this.Channel.EnqueueWithoutDispatch(item, this.DequeueCallback); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- GridViewColumnCollection.cs
- TempFiles.cs
- CheckPair.cs
- MediaSystem.cs
- FontConverter.cs
- DocumentViewerAutomationPeer.cs
- SmiRecordBuffer.cs
- LayoutDump.cs
- GeometryCollection.cs
- DataGridState.cs
- ResourcePart.cs
- BinHexDecoder.cs
- Schedule.cs
- RichTextBox.cs
- RevocationPoint.cs
- FormConverter.cs
- DefaultValidator.cs
- QEncodedStream.cs
- MethodBuilderInstantiation.cs
- documentsequencetextpointer.cs
- OleDbConnectionInternal.cs
- HostSecurityManager.cs
- ScrollItemProviderWrapper.cs
- MetadataPropertyAttribute.cs
- AssociationTypeEmitter.cs
- DurableTimerExtension.cs
- MetadataCache.cs
- ListView.cs
- SqlMethodAttribute.cs
- Accessors.cs
- Utilities.cs
- PassportIdentity.cs
- TemplateNameScope.cs
- CommandDesigner.cs
- XpsResourceDictionary.cs
- Stack.cs
- RelativeSource.cs
- StyleCollectionEditor.cs
- SmiMetaData.cs
- PersonalizationProvider.cs
- IWorkflowDebuggerService.cs
- AtomContentProperty.cs
- SecureStringHasher.cs
- SymLanguageType.cs
- Membership.cs
- UnorderedHashRepartitionStream.cs
- ConfigViewGenerator.cs
- InvalidateEvent.cs
- ImageButton.cs
- FamilyTypefaceCollection.cs
- ServicePointManagerElement.cs
- NavigationEventArgs.cs
- GridView.cs
- SmiEventSink.cs
- ControlPaint.cs
- XmlCodeExporter.cs
- CharacterMetricsDictionary.cs
- ScaleTransform.cs
- DelegatedStream.cs
- SortFieldComparer.cs
- ComplusEndpointConfigContainer.cs
- XmlProcessingInstruction.cs
- BaseParaClient.cs
- MouseGestureValueSerializer.cs
- DesignerActionMethodItem.cs
- ClockController.cs
- StringConverter.cs
- CheckBoxPopupAdapter.cs
- CroppedBitmap.cs
- ConnectionPoint.cs
- DataGridRowHeaderAutomationPeer.cs
- XhtmlBasicTextViewAdapter.cs
- WorkflowApplicationUnloadedException.cs
- ListComponentEditorPage.cs
- ObjectDataSourceEventArgs.cs
- AlphaSortedEnumConverter.cs
- Pair.cs
- FamilyMapCollection.cs
- DataGridDetailsPresenterAutomationPeer.cs
- TreeViewCancelEvent.cs
- ToolboxItemAttribute.cs
- InlinedAggregationOperatorEnumerator.cs
- FileFormatException.cs
- RoutedEventHandlerInfo.cs
- StyleXamlParser.cs
- MULTI_QI.cs
- SessionSwitchEventArgs.cs
- UDPClient.cs
- QueryOptionExpression.cs
- JsonWriter.cs
- UnsafeNativeMethods.cs
- DataSourceControlBuilder.cs
- ToolStripDesignerAvailabilityAttribute.cs
- EventLogPermissionEntry.cs
- SystemIPInterfaceProperties.cs
- WebConfigurationFileMap.cs
- PackageFilter.cs
- MemberListBinding.cs
- GeometryHitTestParameters.cs
- MetadataArtifactLoaderCompositeFile.cs