public override void Send(object message, IActorRef sender)
{
_routees.Shuffle();
var routeeIndex = new AtomicCounter(0);
var completion = new TaskCompletionSource<object>();
var cancelable = new Cancelable(_scheduler);
completion.Task
.ContinueWith(task => cancelable.Cancel(false));
if (_routees.Length == 0)
{
completion.TrySetResult(NoRoutee);
}
else
{
_scheduler.Advanced.ScheduleRepeatedly(TimeSpan.Zero, _interval, async () =>
{
var currentIndex = routeeIndex.GetAndIncrement();
if (currentIndex >= _routees.Length)
return;
try
{
completion.TrySetResult(await ((Task<object>)_routees[currentIndex].Ask(message, _within)));
}
catch (TaskCanceledException)
{
completion.TrySetResult(
new Status.Failure(
new TimeoutException(String.Format("Ask timed out on {0} after {1}", sender, _within))));
}
}, cancelable);
}
completion.Task.PipeTo(sender);
}
}