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
- DuplexChannelFactory.cs
- DataSourceExpressionCollection.cs
- DataPagerFieldCollection.cs
- SizeAnimation.cs
- FrameworkReadOnlyPropertyMetadata.cs
- IsolatedStorageFilePermission.cs
- MessageEventSubscriptionService.cs
- _NegoStream.cs
- CommunicationException.cs
- CallbackDebugBehavior.cs
- DataListItem.cs
- _BaseOverlappedAsyncResult.cs
- CodeConditionStatement.cs
- ConfigurationErrorsException.cs
- BigInt.cs
- SchemaNotation.cs
- metadatamappinghashervisitor.cs
- TextServicesCompartmentEventSink.cs
- JsonGlobals.cs
- CodeFieldReferenceExpression.cs
- ParseNumbers.cs
- InvokeWebService.cs
- ListSortDescription.cs
- XpsPackagingException.cs
- ToolboxControl.cs
- AttachmentCollection.cs
- BooleanKeyFrameCollection.cs
- LabelAutomationPeer.cs
- HttpWebRequest.cs
- PaperSize.cs
- WinCategoryAttribute.cs
- XmlObjectSerializer.cs
- DataGridCommandEventArgs.cs
- DataSourceUtil.cs
- IdentityNotMappedException.cs
- Region.cs
- Thread.cs
- ElementHost.cs
- BamlRecordWriter.cs
- MulticastDelegate.cs
- Crypto.cs
- COM2FontConverter.cs
- MemberHolder.cs
- PtsContext.cs
- TransportSecurityHelpers.cs
- NotCondition.cs
- Span.cs
- NativeMethods.cs
- HtmlPhoneCallAdapter.cs
- ClientBuildManagerCallback.cs
- XamlFigureLengthSerializer.cs
- FixedPage.cs
- Timer.cs
- WebGetAttribute.cs
- ArrayMergeHelper.cs
- BitSet.cs
- TextBoxBase.cs
- ISAPIWorkerRequest.cs
- ObjectStorage.cs
- ScriptControlDescriptor.cs
- SiteMapNode.cs
- DocumentPropertiesDialog.cs
- DataGridViewDataErrorEventArgs.cs
- GPRECT.cs
- MetabaseReader.cs
- InstanceCreationEditor.cs
- _UriSyntax.cs
- DateTimeConverter.cs
- PropertyEntry.cs
- AdornerDecorator.cs
- EditModeSwitchButton.cs
- RadialGradientBrush.cs
- ScrollBarAutomationPeer.cs
- SerializationInfo.cs
- SecondaryIndex.cs
- FixedDocumentPaginator.cs
- ReverseInheritProperty.cs
- QilExpression.cs
- SpotLight.cs
- HtmlCalendarAdapter.cs
- StateChangeEvent.cs
- XmlCharCheckingReader.cs
- XmlSchemaComplexContentExtension.cs
- SpotLight.cs
- HelloOperationCD1AsyncResult.cs
- X509Certificate2Collection.cs
- XPathDescendantIterator.cs
- PageParser.cs
- CompilerGeneratedAttribute.cs
- oledbconnectionstring.cs
- DataSetMappper.cs
- AlphabeticalEnumConverter.cs
- XmlSchemaGroup.cs
- TextProperties.cs
- PriorityChain.cs
- XmlText.cs
- ModifiableIteratorCollection.cs
- VariableQuery.cs
- WebPartManager.cs
- NameTable.cs