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
- X500Name.cs
- QilName.cs
- TreeNodeStyleCollectionEditor.cs
- PipelineComponent.cs
- WindowsGraphicsWrapper.cs
- BitmapEffectInputConnector.cs
- HtmlElementEventArgs.cs
- PassportPrincipal.cs
- RepeatInfo.cs
- ReadOnlyHierarchicalDataSource.cs
- RuleInfoComparer.cs
- TypeConstant.cs
- EnlistmentState.cs
- HttpApplication.cs
- XmlNamespaceMappingCollection.cs
- Missing.cs
- UriExt.cs
- ListViewUpdatedEventArgs.cs
- CodeDelegateInvokeExpression.cs
- BufferedOutputStream.cs
- FixedPage.cs
- SkewTransform.cs
- ZipIOZip64EndOfCentralDirectoryBlock.cs
- FilteredAttributeCollection.cs
- COM2PropertyPageUITypeConverter.cs
- OdbcCommandBuilder.cs
- CallInfo.cs
- HttpRawResponse.cs
- StateItem.cs
- DisposableCollectionWrapper.cs
- ReadOnlyMetadataCollection.cs
- DateTimeFormat.cs
- ViewBox.cs
- ProcessInfo.cs
- SqlUtils.cs
- XmlReader.cs
- AvTrace.cs
- PageCanvasSize.cs
- CommonEndpointBehaviorElement.cs
- Missing.cs
- Fx.cs
- storepermission.cs
- MenuItemStyleCollection.cs
- DataControlLinkButton.cs
- ModelFactory.cs
- CookieHandler.cs
- BorderGapMaskConverter.cs
- WebResourceUtil.cs
- MulticastDelegate.cs
- RadioButtonRenderer.cs
- Authorization.cs
- BaseCollection.cs
- UIHelper.cs
- ObjectQueryExecutionPlan.cs
- OuterGlowBitmapEffect.cs
- WindowsTreeView.cs
- MailDefinition.cs
- StringStorage.cs
- NetCodeGroup.cs
- FaultContractAttribute.cs
- AttachmentService.cs
- ZipIOExtraFieldPaddingElement.cs
- DeclarativeCatalogPart.cs
- DiscoveryDocumentSearchPattern.cs
- CustomValidator.cs
- TemplateXamlParser.cs
- DocumentOrderQuery.cs
- WindowsFont.cs
- SafeRightsManagementPubHandle.cs
- ExecutionEngineException.cs
- NetSectionGroup.cs
- HtmlInputPassword.cs
- DocumentApplicationJournalEntryEventArgs.cs
- HttpClientCertificate.cs
- SpotLight.cs
- DurableOperationAttribute.cs
- OdbcConnectionPoolProviderInfo.cs
- PingReply.cs
- SoapExtensionTypeElement.cs
- KeyGestureConverter.cs
- ActivityExecutorOperation.cs
- SqlCacheDependencyDatabaseCollection.cs
- IODescriptionAttribute.cs
- Encoding.cs
- TableParaClient.cs
- EventMappingSettings.cs
- DelegatingTypeDescriptionProvider.cs
- FixedSOMLineRanges.cs
- QueryStringParameter.cs
- Barrier.cs
- ReadOnlyHierarchicalDataSourceView.cs
- FreezableOperations.cs
- ForwardPositionQuery.cs
- AdRotator.cs
- SystemIPInterfaceProperties.cs
- CacheSection.cs
- ColumnHeaderConverter.cs
- SystemDiagnosticsSection.cs
- ActivityExecutorOperation.cs
- LiteralLink.cs