Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / NetFx40 / System.ServiceModel.Discovery / System / ServiceModel / Discovery / RandomDelayQueuedSendsAsyncResult.cs / 1305376 / RandomDelayQueuedSendsAsyncResult.cs
//----------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//---------------------------------------------------------------
namespace System.ServiceModel.Discovery
{
using System.Runtime;
using System.Threading;
using System.Collections.Generic;
abstract class RandomDelayQueuedSendsAsyncResult :
IteratorAsyncResult>
where TItem : class
{
readonly InputQueue itemQueue;
readonly Random random;
readonly double maxRandomDelayInMillis;
readonly int[] preCalculatedDelays;
readonly bool doDelay;
static AsyncStep dequeueStep;
static AsyncStep delayStep;
static AsyncStep sendItemStep;
TItem currentItem;
int currentDelayIndex;
public RandomDelayQueuedSendsAsyncResult(
TimeSpan maxRandomDelay,
InputQueue itemQueue,
AsyncCallback callback,
object state)
: base(callback, state)
{
Fx.Assert(maxRandomDelay >= TimeSpan.Zero, "The maxRandomDelay parameter must be non negative.");
Fx.Assert(itemQueue != null, "The itemQueue parameter must be non null.");
this.itemQueue = itemQueue;
this.doDelay = maxRandomDelay > TimeSpan.Zero;
if (this.doDelay)
{
this.random = new Random();
this.maxRandomDelayInMillis = maxRandomDelay.TotalMilliseconds;
if (this.itemQueue.PendingCount > 0)
{
this.preCalculatedDelays = new int[this.itemQueue.PendingCount];
this.PreCalculateSendDelays();
}
}
}
public IAsyncResult BeginDelay(AsyncCallback callback, object state)
{
return new DelayAsyncResult(this, callback, state);
}
public void EndDelay(IAsyncResult result)
{
DelayAsyncResult.End(result);
}
protected override IEnumerator GetAsyncSteps()
{
while (true)
{
yield return RandomDelayQueuedSendsAsyncResult.GetDequeueStep();
if (this.currentItem == null)
{
yield break;
}
if (this.doDelay)
{
yield return RandomDelayQueuedSendsAsyncResult.GetDelayStep();
}
yield return RandomDelayQueuedSendsAsyncResult.GetSendItemStep();
}
}
protected void Start(TimeSpan timeout)
{
this.Start(this, timeout);
}
protected abstract IAsyncResult OnBeginSendItem(
TItem item,
TimeSpan timeout,
AsyncCallback callback,
object state);
protected abstract void OnEndSendItem(IAsyncResult result);
static AsyncStep GetDequeueStep()
{
if (dequeueStep == null)
{
dequeueStep = RandomDelayQueuedSendsAsyncResult.CallAsync(
(thisPtr, t, c, s) => thisPtr.itemQueue.BeginDequeue(TimeSpan.MaxValue, c, s),
(thisPtr, r) => thisPtr.currentItem = thisPtr.itemQueue.EndDequeue(r));
}
return dequeueStep;
}
static AsyncStep GetDelayStep()
{
if (delayStep == null)
{
delayStep = RandomDelayQueuedSendsAsyncResult.CallAsync(
(thisPtr, t, c, s) => thisPtr.BeginDelay(c, s),
(thisPtr, r) => thisPtr.EndDelay(r));
}
return delayStep;
}
static AsyncStep GetSendItemStep()
{
if (sendItemStep == null)
{
sendItemStep = RandomDelayQueuedSendsAsyncResult.CallParallel(
(thisPtr, t, c, s) => thisPtr.OnBeginSendItem(thisPtr.currentItem, t, c, s),
(thisPtr, r) => thisPtr.OnEndSendItem(r));
}
return sendItemStep;
}
void PreCalculateSendDelays()
{
this.currentDelayIndex = 0;
for (int i = 0; i < this.preCalculatedDelays.Length; i++)
{
this.preCalculatedDelays[i] = (int)(this.random.NextDouble() * this.maxRandomDelayInMillis);
}
Array.Sort(this.preCalculatedDelays);
}
int GetNextDelay()
{
int delay = 0;
if ((this.preCalculatedDelays == null) || (this.preCalculatedDelays.Length == 0))
{
delay = (int)(this.maxRandomDelayInMillis * this.random.NextDouble());
}
else
{
if (this.preCalculatedDelays.Length == 1 || this.currentDelayIndex == 0)
{
delay = this.preCalculatedDelays[0];
}
else
{
this.currentDelayIndex++;
if (currentDelayIndex == this.preCalculatedDelays.Length)
{
this.currentDelayIndex = 1;
}
delay = this.preCalculatedDelays[this.currentDelayIndex] -
this.preCalculatedDelays[this.currentDelayIndex - 1];
}
}
return delay;
}
class DelayAsyncResult : AsyncResult
{
readonly IOThreadTimer delayTimer;
static Action
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- DiscreteKeyFrames.cs
- MemberCollection.cs
- CompilationSection.cs
- ScrollBarAutomationPeer.cs
- FileDialog.cs
- ConcurrencyMode.cs
- DataGridViewDataConnection.cs
- ConfigurationElementProperty.cs
- WindowsUpDown.cs
- GridView.cs
- GroupBoxAutomationPeer.cs
- CngAlgorithm.cs
- ObjectTag.cs
- NameValuePair.cs
- SpellerInterop.cs
- DeferredSelectedIndexReference.cs
- IIS7WorkerRequest.cs
- Faults.cs
- Route.cs
- TextCompositionEventArgs.cs
- SoapSchemaMember.cs
- DropShadowBitmapEffect.cs
- NumericUpDownAcceleration.cs
- RectangleF.cs
- _LocalDataStore.cs
- TileBrush.cs
- ThemeDirectoryCompiler.cs
- OptimizedTemplateContent.cs
- DocumentXmlWriter.cs
- BaseTreeIterator.cs
- DbReferenceCollection.cs
- ScriptReferenceEventArgs.cs
- TrustSection.cs
- TypeDependencyAttribute.cs
- DataReaderContainer.cs
- Publisher.cs
- SqlPersistenceWorkflowInstanceDescription.cs
- HwndHost.cs
- XmlNamedNodeMap.cs
- MessagePartSpecification.cs
- Win32PrintDialog.cs
- HttpApplication.cs
- _SafeNetHandles.cs
- SoapServerMethod.cs
- TypeResolver.cs
- DataKeyCollection.cs
- CultureSpecificStringDictionary.cs
- Polyline.cs
- TextHidden.cs
- Italic.cs
- FreezableOperations.cs
- DataRowCollection.cs
- RootBrowserWindowProxy.cs
- Selector.cs
- KeyFrames.cs
- GradientStopCollection.cs
- ComboBox.cs
- XhtmlBasicValidationSummaryAdapter.cs
- Drawing.cs
- DetailsViewDeletedEventArgs.cs
- QfeChecker.cs
- Exceptions.cs
- BinHexEncoder.cs
- OpacityConverter.cs
- SetterBase.cs
- DesignerSerializationVisibilityAttribute.cs
- EventLogEntry.cs
- OpCellTreeNode.cs
- Rectangle.cs
- BasicBrowserDialog.designer.cs
- TextBoxRenderer.cs
- _BufferOffsetSize.cs
- COM2EnumConverter.cs
- DataGridDefaultColumnWidthTypeConverter.cs
- SqlRewriteScalarSubqueries.cs
- BrowserCapabilitiesFactory35.cs
- RemotingException.cs
- X509AudioLogo.cs
- Normalization.cs
- DataGridViewCellFormattingEventArgs.cs
- DataGridViewRowPostPaintEventArgs.cs
- documentsequencetextcontainer.cs
- XmlArrayAttribute.cs
- SmtpNegotiateAuthenticationModule.cs
- XmlSchemaAttributeGroup.cs
- RedirectionProxy.cs
- RenderData.cs
- FontFamily.cs
- LinkButton.cs
- ProjectionCamera.cs
- StatusBar.cs
- IBuiltInEvidence.cs
- GenericUI.cs
- HtmlInputText.cs
- HotSpot.cs
- SqlXmlStorage.cs
- FramingChannels.cs
- RestHandlerFactory.cs
- ObjectDataProvider.cs
- ServiceBuildProvider.cs