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
- TemplateBindingExtensionConverter.cs
- SystemSounds.cs
- WorkflowShape.cs
- DesignTimeResourceProviderFactoryAttribute.cs
- WebServiceParameterData.cs
- TextWriter.cs
- UserControlBuildProvider.cs
- DataGridViewControlCollection.cs
- CleanUpVirtualizedItemEventArgs.cs
- MessageSecurityOverTcpElement.cs
- FindCriteriaCD1.cs
- SoapInteropTypes.cs
- WeakRefEnumerator.cs
- StrongNameHelpers.cs
- Crc32.cs
- VariableModifiersHelper.cs
- SqlFacetAttribute.cs
- FrameworkContentElementAutomationPeer.cs
- MultipartIdentifier.cs
- QueryOptionExpression.cs
- CompilerScopeManager.cs
- ChannelServices.cs
- adornercollection.cs
- TextWriterTraceListener.cs
- Main.cs
- UIElement.cs
- CodeMemberMethod.cs
- RSAOAEPKeyExchangeFormatter.cs
- IdentityManager.cs
- SchemaNames.cs
- DataMemberFieldEditor.cs
- Scheduler.cs
- FileLevelControlBuilderAttribute.cs
- RegistryPermission.cs
- XmlTextAttribute.cs
- WebPartZoneCollection.cs
- AspNetHostingPermission.cs
- Button.cs
- DocumentReferenceCollection.cs
- SystemColorTracker.cs
- FileSystemInfo.cs
- SafeNativeMethods.cs
- Matrix.cs
- PenContexts.cs
- SponsorHelper.cs
- StringToken.cs
- SafeCryptoHandles.cs
- ZipIOExtraFieldPaddingElement.cs
- DocumentViewerConstants.cs
- PenThreadPool.cs
- InstanceCompleteException.cs
- EdmType.cs
- Timeline.cs
- SqlBuilder.cs
- Socket.cs
- DataBindingHandlerAttribute.cs
- CustomTypeDescriptor.cs
- TableDetailsCollection.cs
- FileSecurity.cs
- Page.cs
- Label.cs
- XmlObjectSerializerWriteContext.cs
- HtmlInputCheckBox.cs
- OneToOneMappingSerializer.cs
- PageSetupDialog.cs
- InfoCardMasterKey.cs
- CodeNamespaceImport.cs
- WebServiceEnumData.cs
- ColumnHeaderConverter.cs
- Hex.cs
- WinFormsUtils.cs
- DuplicateMessageDetector.cs
- LocatorPart.cs
- SingletonConnectionReader.cs
- SynthesizerStateChangedEventArgs.cs
- WebScriptEndpoint.cs
- FillBehavior.cs
- SignedXml.cs
- CommandSet.cs
- HtmlTableRow.cs
- OracleCommand.cs
- VisualBrush.cs
- DocumentPaginator.cs
- CodeTypeMember.cs
- WebServiceErrorEvent.cs
- Size3D.cs
- Cursor.cs
- XPathNodeList.cs
- LinearQuaternionKeyFrame.cs
- DXD.cs
- ApplicationId.cs
- DefaultMergeHelper.cs
- Keywords.cs
- PropertyGeneratedEventArgs.cs
- TriggerActionCollection.cs
- _CacheStreams.cs
- TreeNodeSelectionProcessor.cs
- MD5CryptoServiceProvider.cs
- SingleObjectCollection.cs
- Matrix3DConverter.cs