示例#1
0
        public static async Task <T> WaitForMessageAsync <T, TError, TBase>(
            this IMessageTransport <TBase> transport, TimeSpan timeout, Action startAction = null, Func <T, bool> filter = null, Func <TError, bool> errorFilter = null)
            where T : TBase
            where TError : TBase, IConvertToException
        {
            return((T)(await TaskExtensions.EventTask <IMessageTransport <TBase>, MessageReceivedEventArgs <TBase> >(
                           transport,
                           startAction,
                           (o, e) => o.MessageReceived += e,
                           (o, e) => o.MessageReceived -= e,
                           (e) =>
            {
                if (e.Message is TError)
                {
                    var error = (TError)e.Message;
                    if (errorFilter == null || !errorFilter(error))
                    {
                        throw error.ToException();
                    }
                }

                if (e.Message is T)
                {
                    if (filter != null)
                    {
                        return filter((T)e.Message);
                    }

                    return true;
                }

                return false;
            },
                           timeout)).Message);
        }
示例#2
0
        public static async Task <T> WaitForMessageAsync <T, TBase>(
            this IMessageTransport <TBase> transport, TimeSpan timeout, Action startAction = null, Func <T, bool> filter = null)
            where T : TBase
        {
            return((T)(await TaskExtensions.EventTask <IMessageTransport <TBase>, MessageReceivedEventArgs <TBase> >(
                           transport,
                           startAction,
                           (o, e) => o.MessageReceived += e,
                           (o, e) => o.MessageReceived -= e,
                           (e) =>
            {
                if (e.Message is T)
                {
                    if (filter != null)
                    {
                        return filter((T)e.Message);
                    }

                    return true;
                }

                return false;
            },
                           timeout)).Message);
        }