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
- TimelineGroup.cs
- XPathExpr.cs
- ProfessionalColorTable.cs
- WebUtil.cs
- TextSerializer.cs
- ResourceDisplayNameAttribute.cs
- FreezableDefaultValueFactory.cs
- PopupRoot.cs
- ReturnType.cs
- ServiceNameCollection.cs
- ProtocolsConfigurationHandler.cs
- DispatcherProcessingDisabled.cs
- DbConnectionInternal.cs
- AdvancedBindingPropertyDescriptor.cs
- WindowsSysHeader.cs
- XmlSchemaIdentityConstraint.cs
- TextEditorSelection.cs
- InputReferenceExpression.cs
- TranslateTransform3D.cs
- MenuItemBindingCollection.cs
- SqlDataSourceView.cs
- DirectionalAction.cs
- HtmlTableRow.cs
- SqlParameter.cs
- WindowsFormsHost.cs
- Events.cs
- DataPointer.cs
- XpsSerializationManager.cs
- TypeConverterAttribute.cs
- AlternateViewCollection.cs
- OperationCanceledException.cs
- KeySpline.cs
- LinqDataSourceContextData.cs
- CompModSwitches.cs
- PtsHelper.cs
- DynamicActivity.cs
- CompilationLock.cs
- ReferenceService.cs
- CqlParserHelpers.cs
- regiisutil.cs
- ThemeDirectoryCompiler.cs
- CounterSampleCalculator.cs
- IdleTimeoutMonitor.cs
- MappingSource.cs
- TreeBuilderBamlTranslator.cs
- WhitespaceRule.cs
- AssemblyInfo.cs
- CreateUserWizardStep.cs
- TextInfo.cs
- WebServiceResponseDesigner.cs
- ApplyTemplatesAction.cs
- RIPEMD160.cs
- RoleManagerEventArgs.cs
- ToolStripItemRenderEventArgs.cs
- IgnoreSectionHandler.cs
- WindowsScroll.cs
- RegexCharClass.cs
- remotingproxy.cs
- SmiEventSink_Default.cs
- CompilerInfo.cs
- PropertyGrid.cs
- RC2.cs
- NetSectionGroup.cs
- DataGridViewRowConverter.cs
- EntityParameter.cs
- ExpandoObject.cs
- KnownTypesHelper.cs
- ClientConfigurationHost.cs
- UnsafeCollabNativeMethods.cs
- GridToolTip.cs
- TTSEngineTypes.cs
- HttpWebRequest.cs
- TextServicesCompartmentEventSink.cs
- DialogResultConverter.cs
- ResourceBinder.cs
- CSharpCodeProvider.cs
- IisTraceListener.cs
- Expressions.cs
- GeometryGroup.cs
- HttpCacheParams.cs
- WindowsTab.cs
- QueryRewriter.cs
- XsltArgumentList.cs
- SecuritySessionFilter.cs
- ClickablePoint.cs
- ImageAutomationPeer.cs
- ClientTargetCollection.cs
- DbConnectionOptions.cs
- ReadOnlyMetadataCollection.cs
- EnvelopeVersion.cs
- SchemaElementLookUpTableEnumerator.cs
- SmtpDigestAuthenticationModule.cs
- ExpressionVisitorHelpers.cs
- ArraySortHelper.cs
- ScrollViewerAutomationPeer.cs
- PriorityQueue.cs
- GetRecipientRequest.cs
- CodePageEncoding.cs
- PropertyEmitter.cs
- LabelDesigner.cs