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
- FormsAuthenticationConfiguration.cs
- ActivityMarkupSerializationProvider.cs
- ProvideValueServiceProvider.cs
- DefaultBindingPropertyAttribute.cs
- CodeVariableDeclarationStatement.cs
- StandardToolWindows.cs
- SchemaObjectWriter.cs
- FontConverter.cs
- ValueTypeFixupInfo.cs
- ResolvedKeyFrameEntry.cs
- AlternateView.cs
- NotifyIcon.cs
- XmlChildNodes.cs
- Tracer.cs
- AliasedSlot.cs
- BaseAutoFormat.cs
- HttpCookiesSection.cs
- TextEffectResolver.cs
- Invariant.cs
- AbsoluteQuery.cs
- CompositeFontInfo.cs
- DataContractSet.cs
- GenericXmlSecurityToken.cs
- AssociationTypeEmitter.cs
- TypeToken.cs
- BufferModeSettings.cs
- RSAOAEPKeyExchangeFormatter.cs
- DataRowChangeEvent.cs
- WebInvokeAttribute.cs
- TableLayoutCellPaintEventArgs.cs
- MsdtcWrapper.cs
- IsolatedStorageException.cs
- BitmapEffectState.cs
- PointLight.cs
- SoapProtocolImporter.cs
- BoundingRectTracker.cs
- ColorAnimationBase.cs
- ObjectListSelectEventArgs.cs
- DataSvcMapFileSerializer.cs
- PathTooLongException.cs
- MessagePartDescriptionCollection.cs
- WindowsGrip.cs
- Trace.cs
- DataGridViewCellStyleContentChangedEventArgs.cs
- Int32AnimationUsingKeyFrames.cs
- CommonDialog.cs
- SqlTriggerAttribute.cs
- X509ChainPolicy.cs
- SqlUDTStorage.cs
- NetworkCredential.cs
- AttributeQuery.cs
- TreeViewHitTestInfo.cs
- GridViewCellAutomationPeer.cs
- SourceFilter.cs
- WebPartManagerInternals.cs
- SmtpNetworkElement.cs
- Iis7Helper.cs
- AtlasWeb.Designer.cs
- HttpClientCertificate.cs
- odbcmetadatacolumnnames.cs
- BuildProviderUtils.cs
- XmlSigningNodeWriter.cs
- AddInControllerImpl.cs
- GACIdentityPermission.cs
- DataGridViewLinkCell.cs
- StylusButtonEventArgs.cs
- Version.cs
- DPAPIProtectedConfigurationProvider.cs
- AsyncContentLoadedEventArgs.cs
- DesignerVerb.cs
- ParameterBuilder.cs
- ThreadPool.cs
- DataGrid.cs
- AuthenticateEventArgs.cs
- _CookieModule.cs
- ImageListImage.cs
- MDIClient.cs
- QilGenerator.cs
- VirtualPath.cs
- MouseEvent.cs
- SecurityKeyEntropyMode.cs
- ShapingEngine.cs
- FreezableOperations.cs
- ValidationError.cs
- TreeNodeBindingCollection.cs
- OptimalBreakSession.cs
- Permission.cs
- ToolStripItem.cs
- RadioButton.cs
- MouseButtonEventArgs.cs
- CleanUpVirtualizedItemEventArgs.cs
- IOThreadTimer.cs
- ConfigurationManagerInternalFactory.cs
- TableSectionStyle.cs
- XmlnsDictionary.cs
- PerformanceCounterPermissionEntry.cs
- ToolStripMenuItem.cs
- Compiler.cs
- ReadWriteObjectLock.cs
- DataGridViewRowContextMenuStripNeededEventArgs.cs