/// <summary>
        /// Execute a user defined Lambda against an IMessageContext
        /// and wait for all activity to end
        /// </summary>
        /// <param name="action"></param>
        /// <returns></returns>
        public async Task <ITrackedSession> ExecuteAndWait(Func <IMessageContext, Task> action)
        {
            _session.Execution = action;
            await _session.ExecuteAndTrack();

            return(_session);
        }
        /// <summary>
        ///     Executes an action and waits until the execution of all messages and all cascading messages
        ///     have completed
        /// </summary>
        /// <param name="runtime"></param>
        /// <param name="action"></param>
        /// <returns></returns>
        public static async Task <ITrackedSession> ExecuteAndWait(this IHost host,
                                                                  Func <IMessageContext, Task> action,
                                                                  int timeoutInMilliseconds = 5000)
        {
            TrackedSession session = new TrackedSession(host)
            {
                Timeout   = timeoutInMilliseconds.Milliseconds(),
                Execution = action
            };

            await session.ExecuteAndTrack();

            return(session);
        }