public async Task <TMessage[]> WaitAsync(TimeSpan timeout, CancellationToken cancellationToken) { foreach (var message in _listener.GetMessages <TMessage>()) { HandleMessage(message); if (IsFinished) { break; } } await Task.WhenAny(_tcs.Task, Task.Delay(timeout, cancellationToken)); StopListening(); cancellationToken.ThrowIfCancellationRequested(); var messages = _listener.GetMessages <TMessage>().Where(_predicate).Take(_expectedCount).ToArray(); if (messages.Length >= _expectedCount) { return(messages); } throw new TimeoutException($"Failed to receive matching {_expectedCount} {typeof(TMessage).Name} message(s) within {timeout.FormatPretty()}:\n\nReceived {messages.Length} messages matching criteria:\n{ObjectFormatter.DumpMany(messages)}\n\nLast recorded {typeof(TMessage).Name} messages:\n{ObjectFormatter.DumpMany(_listener.GetMessages<TMessage>().Take(10))}"); }
public async Task <TMessage> WaitAsync(TimeSpan timeout, CancellationToken cancellationToken) { foreach (var message in _listener.GetMessages <TMessage>()) { HandleMessage(message); if (_tcs.Task.IsCompleted) { return(await _tcs.Task); } } if (await Task.WhenAny(_tcs.Task, Task.Delay(timeout, cancellationToken)) == _tcs.Task) { return(await _tcs.Task); } cancellationToken.ThrowIfCancellationRequested(); throw new TimeoutException($"Failed to receive matching {typeof(TMessage).Name} within {timeout.FormatPretty()}.\n\nLast recorded {typeof(TMessage).Name} messages:\n{ObjectFormatter.DumpMany(_listener.GetMessages<TMessage>().Take(10))}"); }