public async Task <T> RequestAsync <T>(PID target, object message, CancellationToken ct) { using var future = GetFuture(); var messageEnvelope = new MessageEnvelope(message, future.Pid); ct.ThrowIfCancellationRequested(); _context.Send(target, messageEnvelope); var task = ct == default || ct == _ct ? future.Task : future.GetTask(ct); var result = await task; switch (result) { case DeadLetterResponse: throw new DeadLetterException(target); case null: case T: return((T)result !); default: throw new InvalidOperationException( $"Unexpected message. Was type {result.GetType()} but expected {typeof(T)}" ); } }
public ISimpleScheduler ScheduleTellOnce(TimeSpan delay, PID target, object message) { Task.Run(async() => { await Task.Delay(delay); _context.Send(target, message); }); return(this); }
public override void RouteMessage(object message) { var i = _random.Next(Values.Count); var pid = Values[i]; _senderContext.Send(pid, message); }
internal static async Task <T> RequestAsync <T>(this ISenderContext self, PID target, object message, CancellationToken cancellationToken) { using var future = new FutureProcess(self.System); var messageEnvelope = new MessageEnvelope(message, future.Pid); self.Send(target, messageEnvelope); var result = await future.GetTask(cancellationToken); switch (result) { case DeadLetterResponse: throw new DeadLetterException(target); case null: case T: return((T)result !); default: throw new InvalidOperationException( $"Unexpected message. Was type {result.GetType()} but expected {typeof(T)}" ); } }