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
- OperationCanceledException.cs
- CreateDataSourceDialog.cs
- COM2ExtendedBrowsingHandler.cs
- ScrollProviderWrapper.cs
- FontFaceLayoutInfo.cs
- DataConnectionHelper.cs
- UdpRetransmissionSettings.cs
- LinqDataSource.cs
- ForceCopyBuildProvider.cs
- MobileSysDescriptionAttribute.cs
- TakeQueryOptionExpression.cs
- StrongNamePublicKeyBlob.cs
- RenderDataDrawingContext.cs
- cache.cs
- ClientSettingsProvider.cs
- BitArray.cs
- FigureHelper.cs
- VisualBasicExpressionConverter.cs
- WinFormsUtils.cs
- AffineTransform3D.cs
- GB18030Encoding.cs
- BevelBitmapEffect.cs
- SocketElement.cs
- PersonalizablePropertyEntry.cs
- UnsafeNativeMethodsPenimc.cs
- codemethodreferenceexpression.cs
- QueryMath.cs
- ComplexBindingPropertiesAttribute.cs
- WpfGeneratedKnownProperties.cs
- CodeAccessPermission.cs
- WebSysDefaultValueAttribute.cs
- BeginStoryboard.cs
- HostingEnvironmentException.cs
- NumberEdit.cs
- WindowManager.cs
- SqlFactory.cs
- BrushConverter.cs
- SafeFindHandle.cs
- XsdDuration.cs
- BamlLocalizer.cs
- HtmlTextArea.cs
- StrokeIntersection.cs
- EncryptedXml.cs
- UnsafeNativeMethods.cs
- Pair.cs
- XmlHierarchicalEnumerable.cs
- XmlQueryCardinality.cs
- FileUpload.cs
- ListBoxItemAutomationPeer.cs
- OracleParameter.cs
- SettingsPropertyValueCollection.cs
- StrokeCollectionConverter.cs
- MethodRental.cs
- DisplayNameAttribute.cs
- ResizingMessageFilter.cs
- SmiContextFactory.cs
- WpfKnownMember.cs
- SpecialFolderEnumConverter.cs
- NameSpaceExtractor.cs
- ImportedNamespaceContextItem.cs
- webclient.cs
- SqlSelectStatement.cs
- CodeMemberMethod.cs
- ReaderWriterLock.cs
- Geometry3D.cs
- SqlUDTStorage.cs
- PerfCounterSection.cs
- CodeAttachEventStatement.cs
- SafeArrayTypeMismatchException.cs
- ReadOnlyState.cs
- SelectorItemAutomationPeer.cs
- FrameworkContentElement.cs
- TextDecoration.cs
- DelegatedStream.cs
- XmlILIndex.cs
- StylusPointPropertyInfo.cs
- FormViewActionList.cs
- LocalizableResourceBuilder.cs
- FreeIndexList.cs
- StylusPointPropertyId.cs
- XPathChildIterator.cs
- SignedInfo.cs
- MethodExpr.cs
- LoginNameDesigner.cs
- DBProviderConfigurationHandler.cs
- ColumnMapTranslator.cs
- WindowCollection.cs
- Adorner.cs
- OperandQuery.cs
- InputLanguageSource.cs
- MatrixTransform.cs
- TextPattern.cs
- LoginCancelEventArgs.cs
- BatchStream.cs
- DataGridLinkButton.cs
- AppliedDeviceFiltersEditor.cs
- Trace.cs
- XmlWrappingReader.cs
- WindowsSpinner.cs
- ColumnPropertiesGroup.cs