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
- WinFormsComponentEditor.cs
- IsolatedStorageException.cs
- DbConnectionPoolGroupProviderInfo.cs
- UriTemplatePathPartiallyEquivalentSet.cs
- BinaryFormatterWriter.cs
- CodeAttributeArgument.cs
- SpeechEvent.cs
- CollectionsUtil.cs
- FixedMaxHeap.cs
- AutoScrollHelper.cs
- CompilerParameters.cs
- SystemIPv6InterfaceProperties.cs
- SubclassTypeValidatorAttribute.cs
- ProjectionPlanCompiler.cs
- Parser.cs
- UIElement.cs
- ProviderIncompatibleException.cs
- MatrixTransform3D.cs
- SqlIdentifier.cs
- NumericExpr.cs
- TextAdaptor.cs
- XmlSchemaObjectTable.cs
- AssemblyEvidenceFactory.cs
- PhysicalOps.cs
- AnnouncementClient.cs
- ControlAdapter.cs
- AuthenticatingEventArgs.cs
- XmlTextEncoder.cs
- Label.cs
- ExeContext.cs
- SchemaAttDef.cs
- AssemblyCache.cs
- BamlTreeMap.cs
- Symbol.cs
- CacheEntry.cs
- DebuggerAttributes.cs
- RelatedPropertyManager.cs
- TcpActivation.cs
- LongValidatorAttribute.cs
- XhtmlBasicPanelAdapter.cs
- ImplicitInputBrush.cs
- EmulateRecognizeCompletedEventArgs.cs
- Margins.cs
- FormViewDeleteEventArgs.cs
- JapaneseCalendar.cs
- GradientSpreadMethodValidation.cs
- StreamUpgradeAcceptor.cs
- TextRangeEditTables.cs
- InstanceLockLostException.cs
- WebPartVerbsEventArgs.cs
- Int32CollectionConverter.cs
- XmlJsonWriter.cs
- XmlSchemaSimpleTypeRestriction.cs
- MissingFieldException.cs
- AuthenticationSection.cs
- PageParserFilter.cs
- ChildTable.cs
- SchemaRegistration.cs
- ToolStripPanelDesigner.cs
- SystemFonts.cs
- StorageFunctionMapping.cs
- FileCodeGroup.cs
- DetailsViewRow.cs
- SeparatorAutomationPeer.cs
- Timeline.cs
- UIElement3D.cs
- EdmSchemaAttribute.cs
- CallbackCorrelationInitializer.cs
- PerformanceCounterLib.cs
- DatePickerAutomationPeer.cs
- SymmetricKey.cs
- ExclusiveTcpListener.cs
- Duration.cs
- RenderData.cs
- BitmapSizeOptions.cs
- ParameterBuilder.cs
- DeferredSelectedIndexReference.cs
- TextSegment.cs
- PackUriHelper.cs
- ConnectionManagementElement.cs
- TreeNodeConverter.cs
- ReflectionServiceProvider.cs
- SQLBytes.cs
- XmlValueConverter.cs
- RoutedUICommand.cs
- GeometryHitTestParameters.cs
- IntPtr.cs
- Compress.cs
- COM2Properties.cs
- DynamicPhysicalDiscoSearcher.cs
- AsymmetricAlgorithm.cs
- SQLMembershipProvider.cs
- BinaryFormatterWriter.cs
- DataGridClipboardCellContent.cs
- Walker.cs
- SendMessageChannelCache.cs
- Style.cs
- SafeSecurityHandles.cs
- URIFormatException.cs
- SpeechSeg.cs