public Task Timeout(ScheduledTaskTimeout state, IMessageHandlerContext context)
        {
            MarkAsComplete();
            if (Data.TimeoutIdentifier != state.Identifier)
            {
                return(Task.CompletedTask);
            }
            ;

            var scheduledTask = GetScheduledTask(state.TaskTypeFullName);

            //zombie timeout, no scheduled task matches the timer's task
            if (null == scheduledTask)
            {
                MarkAsComplete(); return(Task.CompletedTask);
            }

            //zombie timeout, scheduled task is not enabled to run
            if (!scheduledTask.IsEnabled)
            {
                return(Task.CompletedTask);
            }

            var noWait = false;

            try
            {
                using (
                    var tx = new TransactionScope(TransactionScopeOption.RequiresNew,
                                                  new TransactionOptions {
                    IsolationLevel = IsolationLevel.ReadCommitted
                },
                                                  TransactionScopeAsyncFlowOption.Enabled))
                {
                    noWait = scheduledTask.Run();

                    tx.Complete();
                }
            }
            catch (Exception ex)
            {
                logger.ErrorFormat("Scheduled task <{0}> has failed with exception: {1}", state.TaskTypeFullName, ex.ToString());
            }

            var timeout = new ScheduledTaskTimeout
            {
                TaskTypeFullName = state.TaskTypeFullName,
            };

            Data.TimeoutIdentifier = timeout.Identifier;

            return(RequestTimeout(context,
                                  noWait ? DateTime.Now : DateTime.Now.AddSeconds(Data.WaitDuration.TotalSeconds),
                                  timeout));
        }
        public Task Handle(BeginScheduledTask message, IMessageHandlerContext context)
        {
            Data.WaitDuration = message.WaitDuration;

            Data.TaskTypeFullName = message.TaskTypeFullName;

            var timeoutMessage = new ScheduledTaskTimeout
            {
                TaskTypeFullName = message.TaskTypeFullName
            };

            Data.TimeoutIdentifier = timeoutMessage.Identifier;
            return(RequestTimeout <ScheduledTaskTimeout>(context, DateTime.Now, timeoutMessage));
        }