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
- FloaterParagraph.cs
- Rethrow.cs
- ParameterReplacerVisitor.cs
- StreamWriter.cs
- CompiledRegexRunnerFactory.cs
- FolderLevelBuildProviderCollection.cs
- PenThreadWorker.cs
- DeclarativeCatalogPart.cs
- SqlConnectionFactory.cs
- WebPartVerbsEventArgs.cs
- MetadataArtifactLoaderComposite.cs
- FrameworkObject.cs
- LocatorManager.cs
- SafeCoTaskMem.cs
- CompatibleComparer.cs
- FillBehavior.cs
- XmlUtil.cs
- VisualStyleInformation.cs
- GlyphTypeface.cs
- MenuStrip.cs
- SessionSwitchEventArgs.cs
- CornerRadius.cs
- ExtenderProvidedPropertyAttribute.cs
- XmlTextReader.cs
- WebPartDescriptionCollection.cs
- RelationshipConverter.cs
- DecimalAnimationBase.cs
- IPCCacheManager.cs
- WebPartDisplayMode.cs
- ProviderCollection.cs
- xmlsaver.cs
- Vertex.cs
- FontWeight.cs
- PropertyNames.cs
- XmlDeclaration.cs
- GridProviderWrapper.cs
- _RequestLifetimeSetter.cs
- __FastResourceComparer.cs
- KeyFrames.cs
- PageParser.cs
- FileDialogCustomPlace.cs
- Code.cs
- ColorConvertedBitmap.cs
- TemplateControl.cs
- HostedTransportConfigurationBase.cs
- StringUtil.cs
- MessageQueueAccessControlEntry.cs
- SafeEventLogWriteHandle.cs
- CodeExpressionCollection.cs
- IdentityValidationException.cs
- SchemaTypeEmitter.cs
- SafeCoTaskMem.cs
- DataGridViewEditingControlShowingEventArgs.cs
- Utils.cs
- AttributeProviderAttribute.cs
- SafeSerializationManager.cs
- XmlValidatingReaderImpl.cs
- DataGridViewColumnDesigner.cs
- XomlCompilerResults.cs
- ComponentSerializationService.cs
- InvalidDataException.cs
- PathTooLongException.cs
- SByteConverter.cs
- DeleteStoreRequest.cs
- AmbientLight.cs
- _ConnectionGroup.cs
- NameNode.cs
- Hex.cs
- SafeEventLogWriteHandle.cs
- SimpleWorkerRequest.cs
- CdpEqualityComparer.cs
- RoleService.cs
- PageAdapter.cs
- TargetControlTypeAttribute.cs
- SyndicationLink.cs
- Collection.cs
- StyleHelper.cs
- ObfuscationAttribute.cs
- OleDbPermission.cs
- TreeBuilder.cs
- ControlParser.cs
- DataGridViewColumnDesignTimeVisibleAttribute.cs
- PagePropertiesChangingEventArgs.cs
- TemplateParser.cs
- Win32.cs
- PositiveTimeSpanValidatorAttribute.cs
- PointCollectionConverter.cs
- QuerySettings.cs
- MergeLocalizationDirectives.cs
- ClientOptions.cs
- Select.cs
- ClrPerspective.cs
- NonClientArea.cs
- _ChunkParse.cs
- FontEmbeddingManager.cs
- CodeExporter.cs
- EdmSchemaError.cs
- ByteAnimationUsingKeyFrames.cs
- TextServicesProperty.cs
- Panel.cs