Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / ServiceModel / System / ServiceModel / Channels / SingletonChannelAcceptor.cs / 1 / SingletonChannelAcceptor.cs
//------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------- namespace System.ServiceModel.Channels { using System.Collections.Generic; using System.Diagnostics; using System.Threading; using System.ServiceModel.Diagnostics; abstract class SingletonChannelAcceptor: InputQueueChannelAcceptor where ChannelInterfaceType : class, IChannel where TChannel : /*ChannelInterfaceType,*/ InputQueueChannel where QueueItemType : class, IDisposable { TChannel currentChannel; object currentChannelLock = new object(); static WaitCallback onInvokeDequeuedCallback; public SingletonChannelAcceptor(ChannelManagerBase channelManager) : base(channelManager) { } public override ChannelInterfaceType AcceptChannel(TimeSpan timeout) { EnsureChannelAvailable(); return base.AcceptChannel(timeout); } public override IAsyncResult BeginAcceptChannel(TimeSpan timeout, AsyncCallback callback, object state) { EnsureChannelAvailable(); return base.BeginAcceptChannel(timeout, callback, state); } protected TChannel GetCurrentChannel() { return this.currentChannel; } TChannel EnsureChannelAvailable() { bool channelCreated = false; TChannel newChannel; if ((newChannel = currentChannel) == null) { lock (currentChannelLock) { if (IsDisposed) { return null; } if ((newChannel = currentChannel) == null) { newChannel = OnCreateChannel(); newChannel.Closed += OnChannelClosed; currentChannel = newChannel; channelCreated = true; } } } if (channelCreated) { EnqueueAndDispatch((ChannelInterfaceType)(object)newChannel); } return newChannel; } protected abstract TChannel OnCreateChannel(); protected abstract void OnTraceMessageReceived(QueueItemType item); public void DispatchItems() { TChannel channel = EnsureChannelAvailable(); if (channel != null) { channel.Dispatch(); } } public void Enqueue(QueueItemType item) { Enqueue(item, null); } public void Enqueue(QueueItemType item, ItemDequeuedCallback dequeuedCallback) { Enqueue(item, dequeuedCallback, true); } public void Enqueue(QueueItemType item, ItemDequeuedCallback dequeuedCallback, bool canDispatchOnThisThread) { TChannel channel = EnsureChannelAvailable(); if (DiagnosticUtility.ShouldTraceInformation) { OnTraceMessageReceived(item); } if (channel != null) { channel.EnqueueAndDispatch(item, dequeuedCallback, canDispatchOnThisThread); } else { InvokeDequeuedCallback(dequeuedCallback, canDispatchOnThisThread); item.Dispose(); } } public void Enqueue(Exception exception, ItemDequeuedCallback dequeuedCallback) { Enqueue(exception, dequeuedCallback, true); } public void Enqueue(Exception exception, ItemDequeuedCallback dequeuedCallback, bool canDispatchOnThisThread) { TChannel channel = EnsureChannelAvailable(); if (channel != null) { channel.EnqueueAndDispatch(exception, dequeuedCallback, canDispatchOnThisThread); } else { InvokeDequeuedCallback(dequeuedCallback, canDispatchOnThisThread); } } public bool EnqueueWithoutDispatch(QueueItemType item, ItemDequeuedCallback dequeuedCallback) { TChannel channel = EnsureChannelAvailable(); if (DiagnosticUtility.ShouldTraceInformation) { OnTraceMessageReceived(item); } if (channel != null) { return channel.EnqueueWithoutDispatch(item, dequeuedCallback); } else { InvokeDequeuedCallback(dequeuedCallback, false); item.Dispose(); return false; } } public override bool EnqueueWithoutDispatch(Exception exception, ItemDequeuedCallback dequeuedCallback) { TChannel channel = EnsureChannelAvailable(); if (channel != null) { return channel.EnqueueWithoutDispatch(exception, dequeuedCallback); } else { InvokeDequeuedCallback(dequeuedCallback, false); return false; } } public void EnqueueAndDispatch(QueueItemType item, ItemDequeuedCallback dequeuedCallback, bool canDispatchOnThisThread) { TChannel channel = EnsureChannelAvailable(); if (DiagnosticUtility.ShouldTraceInformation) { OnTraceMessageReceived(item); } if (channel != null) { channel.EnqueueAndDispatch(item, dequeuedCallback, canDispatchOnThisThread); } else { InvokeDequeuedCallback(dequeuedCallback, canDispatchOnThisThread); item.Dispose(); } } public override void EnqueueAndDispatch(Exception exception, ItemDequeuedCallback dequeuedCallback, bool canDispatchOnThisThread) { TChannel channel = EnsureChannelAvailable(); if (channel != null) { channel.EnqueueAndDispatch(exception, dequeuedCallback, canDispatchOnThisThread); } else { InvokeDequeuedCallback(dequeuedCallback, canDispatchOnThisThread); } } protected void OnChannelClosed(object sender, EventArgs args) { IChannel channel = (IChannel)sender; lock (currentChannelLock) { if (channel == currentChannel) { currentChannel = null; } } } static void InvokeDequeuedCallback(ItemDequeuedCallback dequeuedCallback, bool canDispatchOnThisThread) { if (dequeuedCallback != null) { if (canDispatchOnThisThread) { dequeuedCallback(); return; } if (onInvokeDequeuedCallback == null) { onInvokeDequeuedCallback = new WaitCallback(OnInvokeDequeuedCallback); } IOThreadScheduler.ScheduleCallback(onInvokeDequeuedCallback, dequeuedCallback); } } static void OnInvokeDequeuedCallback(object state) { DiagnosticUtility.DebugAssert(state != null, "SingletonChannelAcceptor.OnInvokeDequeuedCallback: (state != null)"); ItemDequeuedCallback dequeuedCallback = (ItemDequeuedCallback)state; dequeuedCallback(); } } } // 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
- LessThanOrEqual.cs
- CommentGlyph.cs
- InplaceBitmapMetadataWriter.cs
- DefaultExpressionVisitor.cs
- PinnedBufferMemoryStream.cs
- EventData.cs
- XmlReaderSettings.cs
- SpeakInfo.cs
- RenderingBiasValidation.cs
- StructuredCompositeActivityDesigner.cs
- TemplateComponentConnector.cs
- ReadOnlyTernaryTree.cs
- XPathItem.cs
- CommonProperties.cs
- MessageDroppedTraceRecord.cs
- DoubleUtil.cs
- OutOfMemoryException.cs
- ColumnClickEvent.cs
- CommandPlan.cs
- SEHException.cs
- AdornerPresentationContext.cs
- XmlSignificantWhitespace.cs
- EdmTypeAttribute.cs
- CodeNamespace.cs
- XmlBinaryReader.cs
- HtmlWindow.cs
- DecimalAnimationBase.cs
- CodeSnippetStatement.cs
- InheritanceAttribute.cs
- NativeActivityMetadata.cs
- ResXResourceSet.cs
- SmtpNetworkElement.cs
- ProfessionalColors.cs
- ApplicationHost.cs
- TimeSpanValidatorAttribute.cs
- WindowsSlider.cs
- DownloadProgressEventArgs.cs
- Type.cs
- DrawingServices.cs
- DataSourceUtil.cs
- RoutedUICommand.cs
- ChameleonKey.cs
- PolicyManager.cs
- XmlReflectionImporter.cs
- XmlRawWriter.cs
- ComponentCommands.cs
- ConversionHelper.cs
- InputDevice.cs
- MessageBox.cs
- DeferredBinaryDeserializerExtension.cs
- TimeoutException.cs
- ServiceModelConfigurationSectionGroup.cs
- VisualStateManager.cs
- X509Utils.cs
- DoneReceivingAsyncResult.cs
- CodeGotoStatement.cs
- ForwardPositionQuery.cs
- OleDbConnectionInternal.cs
- ServiceHttpModule.cs
- ReceiveContent.cs
- ReadOnlyAttribute.cs
- Normalizer.cs
- PreProcessor.cs
- GlyphingCache.cs
- Utils.cs
- CaseInsensitiveHashCodeProvider.cs
- PersistenceIOParticipant.cs
- PageParserFilter.cs
- EditBehavior.cs
- TextInfo.cs
- Form.cs
- AdRotator.cs
- ToolStripDropDownClosingEventArgs.cs
- CacheChildrenQuery.cs
- Int64Converter.cs
- WorkflowInstanceContextProvider.cs
- SafeNativeMethods.cs
- FtpWebRequest.cs
- ElementsClipboardData.cs
- Signature.cs
- wmiutil.cs
- DefaultAuthorizationContext.cs
- TraceFilter.cs
- ReadOnlyDictionary.cs
- SqlVersion.cs
- MethodBuilderInstantiation.cs
- CellRelation.cs
- TextCompositionEventArgs.cs
- WebBrowserHelper.cs
- NumericExpr.cs
- MemoryResponseElement.cs
- Rule.cs
- GlyphShapingProperties.cs
- SelectingProviderEventArgs.cs
- CompressedStack.cs
- TextBoxBase.cs
- StorageTypeMapping.cs
- BuiltInExpr.cs
- JobInputBins.cs
- GeneralTransform3DTo2DTo3D.cs