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
- DynamicPhysicalDiscoSearcher.cs
- BooleanKeyFrameCollection.cs
- CategoryAttribute.cs
- TransactionContextManager.cs
- AmbientLight.cs
- AmbientLight.cs
- OutputCacheProfileCollection.cs
- Function.cs
- QilIterator.cs
- Emitter.cs
- RowVisual.cs
- thaishape.cs
- ProtocolsConfigurationHandler.cs
- DeviceSpecific.cs
- CustomErrorsSectionWrapper.cs
- EncoderReplacementFallback.cs
- BitmapData.cs
- RepeaterItemEventArgs.cs
- clipboard.cs
- TdsRecordBufferSetter.cs
- CompiledRegexRunnerFactory.cs
- TextDecoration.cs
- ParagraphVisual.cs
- PackageDigitalSignature.cs
- XPathCompileException.cs
- MimeTypeAttribute.cs
- InstanceNameConverter.cs
- MarkupCompilePass1.cs
- ConfigurationHandlersInstallComponent.cs
- ServiceContractAttribute.cs
- LockedBorderGlyph.cs
- HttpProcessUtility.cs
- Attributes.cs
- WindowAutomationPeer.cs
- WindowsStatic.cs
- ProcessModelInfo.cs
- securitycriticaldata.cs
- WindowsListViewScroll.cs
- Dynamic.cs
- AnchoredBlock.cs
- PriorityQueue.cs
- HotSpot.cs
- EpmHelper.cs
- XsltConvert.cs
- ConfigurationStrings.cs
- PresentationTraceSources.cs
- AxisAngleRotation3D.cs
- DocumentSequence.cs
- EarlyBoundInfo.cs
- xmlsaver.cs
- EmbossBitmapEffect.cs
- XmlILTrace.cs
- HierarchicalDataBoundControl.cs
- Renderer.cs
- SimpleRecyclingCache.cs
- HtmlFormParameterReader.cs
- _UriTypeConverter.cs
- StreamAsIStream.cs
- MailBnfHelper.cs
- ConfigXmlDocument.cs
- InvalidOleVariantTypeException.cs
- ViewBase.cs
- assemblycache.cs
- Constants.cs
- ReaderContextStackData.cs
- SqlDataRecord.cs
- ModuleElement.cs
- ContainerUIElement3D.cs
- BitmapImage.cs
- HealthMonitoringSection.cs
- DataTable.cs
- XmlValueConverter.cs
- Vector3DCollection.cs
- ReadOnlyMetadataCollection.cs
- ExitEventArgs.cs
- ParserHooks.cs
- EventProvider.cs
- DocumentEventArgs.cs
- HitTestParameters3D.cs
- ToolStripItemCollection.cs
- PreloadedPackages.cs
- CDSsyncETWBCLProvider.cs
- ToolStripContainerDesigner.cs
- MultiView.cs
- KernelTypeValidation.cs
- AffineTransform3D.cs
- CompressedStack.cs
- RuntimeHelpers.cs
- ContainerUtilities.cs
- TrustLevelCollection.cs
- _CommandStream.cs
- SimpleColumnProvider.cs
- FixedDocumentSequencePaginator.cs
- DocumentSequence.cs
- xsdvalidator.cs
- Message.cs
- DataGridViewEditingControlShowingEventArgs.cs
- HotSpot.cs
- X509Certificate2.cs
- ImageClickEventArgs.cs