コード例 #1
0
        public static Task <TMessage> Expect <TMessage>(this MessagePipeline <TMessage> pipeline, Predicate <TMessage> filter, CancellationToken cancellationToken = default)
        {
            var tcs = new TaskCompletionSource <TMessage>();

            pipeline.Subscribe(message =>
            {
                if (filter(message))
                {
                    tcs.TrySetResult(message);
                    return(new ValueTask <bool>(false));
                }

                // stay subscribed until we receive the message
                return(new ValueTask <bool>(true));
            });

            // cancel the TCS if the cancellation token expires
            cancellationToken.Register(() =>
            {
                tcs.TrySetCanceled();
            }, false);

            return(tcs.Task);
        }
コード例 #2
0
 public static Task <TMessage> Expect <TMessage>(this MessagePipeline <TMessage> pipeline, Predicate <TMessage> filter, TimeSpan timeSpan)
 => Expect(pipeline, filter, new CancellationTokenSource(timeSpan).Token);