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
- BaseTemplateCodeDomTreeGenerator.cs
- RNGCryptoServiceProvider.cs
- FontStyles.cs
- AsmxEndpointPickerExtension.cs
- ListViewDeleteEventArgs.cs
- SqlAggregateChecker.cs
- EmptyControlCollection.cs
- FormClosedEvent.cs
- WebPartRestoreVerb.cs
- MessageFilterException.cs
- DesignerAdapterUtil.cs
- DisableDpiAwarenessAttribute.cs
- ReferenceList.cs
- SQLDateTime.cs
- MobileUserControlDesigner.cs
- ClientSettingsSection.cs
- UICuesEvent.cs
- HttpEncoder.cs
- SqlCacheDependencyDatabase.cs
- OleDbDataReader.cs
- ParentUndoUnit.cs
- ObjectDataSourceFilteringEventArgs.cs
- DataViewManager.cs
- StringConverter.cs
- HttpWriter.cs
- PermissionListSet.cs
- MsmqInputChannelListener.cs
- FormsAuthenticationUserCollection.cs
- XmlStrings.cs
- COMException.cs
- DesignTimeResourceProviderFactoryAttribute.cs
- NavigationProperty.cs
- ContainsSearchOperator.cs
- EnumBuilder.cs
- PreviewPrintController.cs
- ObjectToIdCache.cs
- UserMapPath.cs
- PaintValueEventArgs.cs
- AnnotationMap.cs
- CrossSiteScriptingValidation.cs
- AssociatedControlConverter.cs
- SignatureHelper.cs
- RequestQueue.cs
- XamlTreeBuilder.cs
- MatrixCamera.cs
- NullableBoolConverter.cs
- Floater.cs
- InstanceDataCollection.cs
- PrimitiveXmlSerializers.cs
- ProviderCommandInfoUtils.cs
- PerformanceCounterLib.cs
- ParsedRoute.cs
- SynchronizedRandom.cs
- Size.cs
- MorphHelper.cs
- UInt32Converter.cs
- cookie.cs
- SizeF.cs
- StrokeCollection.cs
- DelegatedStream.cs
- SrgsDocument.cs
- RelationshipEnd.cs
- IDispatchConstantAttribute.cs
- Pens.cs
- CustomLineCap.cs
- ResourceCodeDomSerializer.cs
- EventLevel.cs
- SqlUserDefinedTypeAttribute.cs
- __Filters.cs
- EntityStoreSchemaGenerator.cs
- IdentityHolder.cs
- ImageListUtils.cs
- XmlSchemaObjectCollection.cs
- HtmlInputSubmit.cs
- ButtonChrome.cs
- Floater.cs
- BitmapEffectInputData.cs
- Int32KeyFrameCollection.cs
- BatchParser.cs
- StatusBar.cs
- NameValueSectionHandler.cs
- StatusCommandUI.cs
- ProgressBarBrushConverter.cs
- StringWriter.cs
- _SpnDictionary.cs
- FormViewModeEventArgs.cs
- Size3D.cs
- TraceSection.cs
- DataGridViewSelectedCellCollection.cs
- StreamingContext.cs
- ShapeTypeface.cs
- TextSpanModifier.cs
- ParsedAttributeCollection.cs
- TimerElapsedEvenArgs.cs
- HyperlinkAutomationPeer.cs
- PointConverter.cs
- PeerObject.cs
- ActivityInterfaces.cs
- DesignerHelpers.cs
- RetrieveVirtualItemEventArgs.cs