public int EnqueueSingleTask <P>(Guid identifier, P parameter, long delay = 0)
        {
            if (delay < 0)
            {
                throw new ArgumentException("delay");
            }

            var info = this.GetTaskInfo(identifier);

            if (info == null)
            {
                throw new ArgumentException(String.Format("Task identifier [{0}] not registered.", identifier.ToString()));
            }

            if (info.ParamType != typeof(P))
            {
                throw new ArgumentException("Parameter type mismatch. Review registered Task and parameter types.");
            }

            var paramStr = JsonConvert.SerializeObject(parameter);

            using (var tr = new TransactionScope(TransactionScopeOption.Suppress, TransactionScopeAsyncFlowOption.Enabled))
                using (var context = CreateRepository())
                {
                    var scheduledAt = this.GetUtcNow().AddMilliseconds(delay).SetFractionalSecondPrecision(4);
                    var data        = new SingleTaskDefinition()
                    {
                        Identifier     = info.Identifier,
                        JsonParameters = paramStr,
                        ScheduledAt    = scheduledAt,
                    };

                    data.SetStatus(Distributed.SingleTaskStatus.Scheduled);

                    context.SingleTasks.Add(data);
                    context.SaveChanges();

                    return(data.Id);
                }
        }
        internal int EnqueueSingleTask(Guid identifier, int?recurrentTaskId, long delay, bool throwOnNotFound = true)
        {
            var info = this.GetTaskInfo(identifier);

            if (info == null)
            {
                if (throwOnNotFound)
                {
                    throw new ApplicationException(String.Format("Task identifier {0} not registered.", identifier));
                }
                else
                {
                    return(0);
                }
            }

            using (var tr = new TransactionScope(TransactionScopeOption.Suppress, TransactionScopeAsyncFlowOption.Enabled))
                using (var context = CreateRepository())
                {
                    var scheduledAt = this.GetUtcNow().AddMilliseconds(delay).SetFractionalSecondPrecision(4);
                    var data        = new SingleTaskDefinition()
                    {
                        Identifier      = info.Identifier,
                        JsonParameters  = null,
                        ScheduledAt     = scheduledAt,
                        RecurrentTaskId = recurrentTaskId
                    };

                    data.SetStatus(Distributed.SingleTaskStatus.Scheduled);

                    context.SingleTasks.Add(data);
                    context.SaveChanges();

                    return(data.Id);
                }
        }