예제 #1
0
        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)}"
                          );
            }
        }
예제 #2
0
        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);
        }
예제 #4
0
        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)}"
                          );
            }
        }