public static async Task <IEnumerable <T> > Match <T>(this IReceivedMessageList published, Expression <Func <IReceivedMessage <T>, bool> > filter, TimeSpan?timeout = default(TimeSpan?)) where T : class { try { var giveUpAt = DateTime.Now + (timeout ?? TimeSpan.FromSeconds(30)); while (DateTime.Now < giveUpAt) { if (published.AsQueryable().Where(x => typeof(T).IsAssignableFrom(x.MessageType)).Cast <IReceivedMessage <T> >().Where(filter).Any()) { return(published.AsQueryable().Where(x => typeof(T).IsAssignableFrom(x.MessageType)).Cast <IReceivedMessage <T> >().Where(filter).Select(x => x.Context.Message).ToList()); } await Task.Delay(10).ConfigureAwait(false); } } catch (InvalidOperationException) { await Task.Delay(10).ConfigureAwait(false); return(await published.Match <T>(filter, timeout)); } return(new T[] { }); }
public static async Task <IEnumerable <T> > Any <T>(this IReceivedMessageList received, Expression <Func <IReceivedMessage <T>, bool> > filter, TimeSpan?timeout = default(TimeSpan?)) where T : class { return(await received.Match <T>(m => m.MessageType == typeof(T) && filter.Compile()(m))); }