コード例 #1
0
        private void ReJoin(DelayTask task)
        {
            var flag = false;

            //不重试
            if (task.MaxRetryCount < 0)
            {
                flag = false;
            }
            else if (task.ExecCount >= task.MaxRetryCount && task.MaxRetryCount > 0)
            {
                flag = false;
            }
            else
            {
                task.TriggerTime = DateTime.Now.AddSeconds(task.RetrySeconds);
                _delayTaskDao.RetryUpdate(task);
                flag = true;
            }

            if (flag)
            {
                _tw.Add(task.Id, task.RetrySeconds);
            }
            else
            {
                //如果不重试,是否要删除
                _delayTaskDao.DeleteById(task.Id);
            }
        }
コード例 #2
0
        public int WaitCount => Interlocked.CompareExchange(ref _waitCount, 0, -1); // Just read, never xchg

        public Task Delay(TimeSpan delay, CancellationToken cancellationToken)
        {
            if (delay <= TimeSpan.Zero)
            {
                return(_completedTask);
            }
            lock (_lock)
            {
                var delayTask = new DelayTask(Clock.GetCurrentDateTimeUtc() + delay, cancellationToken);
                var delayNode = _delays.First;
                while (delayNode != null && delayNode.Value.Scheduled < delayTask.Scheduled)
                {
                    delayNode = delayNode.Next;
                }
                if (delayNode == null)
                {
                    _delays.AddLast(delayTask);
                }
                else
                {
                    _delays.AddBefore(delayNode, delayTask);
                }
                return(delayTask.Tcs.Task);
            }
        }
コード例 #3
0
ファイル: EnemyAI.cs プロジェクト: Aquaivy/KnightAdventure
        private void MoveBlockCheck()
        {
            if (queue_position_x.Count >= 32)
            {
                queue_position_x.Dequeue();
            }

            queue_position_x.Enqueue(character.transform.position.x);

            if (queue_position_x.Count >= 32 && queue_position_x.Max() - queue_position_x.Min() < 0.1f)
            {
                if (RandomUtils.RandomBool())
                {
                    isMoveBlocking = true;
                    //character.Move.Idle();

                    DelayTask.Invoke(() =>
                    {
                        isMoveBlocking = false;
                        queue_position_x.Clear();
                    }, RandomUtils.RandomMinMax(500, 2000));
                }
                else
                {
                    GoToNextPatrolPoint();
                }
            }
        }
コード例 #4
0
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            for (int i = 0; i < 100; i++)
            {
                var index = i;
                Task.Run(async() =>
                {
                    var delayTask = DelayTask.AddTask(index,
                                                      new Func <object, int, Func <Task> >((state, count) => new Func <Task>(() =>
                    {
                        Console.WriteLine($"第{count}次执行:{state},threadId:{System.Threading.Thread.CurrentThread.ManagedThreadId}");
                        return(Task.CompletedTask);
                    })),
                                                      index,
                                                      TimeSpan.FromSeconds(1),
                                                      count =>
                    {
                        if (count > i)
                        {
                            return(null);
                        }
                        return(TimeSpan.FromMilliseconds((i % 3) * 100));
                    });
                    await Task.Delay(5000);
                    delayTask.Stop();
                });
            }

            Console.ReadLine();
        }
コード例 #5
0
        private void CalculateDelayMoves(Moves moves)
        {
            var maxMovesBeforeRiskyAttack = 7;
            var minMovesBeforeRiskyAttack = 1;
            var delayMoves = DelayTask.CalculateDelayTask(BotState, moves, maxMovesBeforeRiskyAttack,
                                                          minMovesBeforeRiskyAttack);

            MovesCommitter.CommittMoves(BotState, delayMoves);
            moves.MergeMoves(delayMoves);
        }
コード例 #6
0
 private void AliveCountdown(int aliveTime)
 {
     taskAliveCountdown?.Release();
     taskAliveCountdown = DelayTask.Invoke(() =>
     {
         if (this.gameObject != null)
         {
             GameObject.Destroy(this.gameObject);
         }
     }, aliveTime);
 }
コード例 #7
0
        public ActionResult DelayEdit(long id = 0)
        {
            var m = _delayTaskService.SingleById(id);

            if (m == null)
            {
                m                = new DelayTask();
                m.Enable         = true;
                m.Method         = "GET";
                m.TimeoutSeconds = 15;
                m.MaxRetryCount  = 3;
                m.RetrySeconds   = 30;
            }

            ViewBag.m = m;
            return(View());
        }
コード例 #8
0
 private Task Delay(Duration delay, CancellationToken cancellationToken = default(CancellationToken))
 {
     lock (_lock)
     {
         var delayTask = new DelayTask(_fakeClock.GetCurrentInstant() + delay, cancellationToken);
         var delayNode = _delays.First;
         while (delayNode != null && delayNode.Value.Scheduled < delayTask.Scheduled)
         {
             delayNode = delayNode.Next;
         }
         if (delayNode == null)
         {
             _delays.AddLast(delayTask);
         }
         else
         {
             _delays.AddBefore(delayNode, delayTask);
         }
         return(delayTask.Tcs.Task);
     }
 }
コード例 #9
0
        private void On_DelayTimer_Tick(object sender, EventArgs e)
        {
            DelayTask currentTask = _TaskQueue[_CurrentTaskIndex];

            if (currentTask.CanRun == null)
            {
                RunTask();
            }
            else
            if (currentTask.MaxAttempts > 0)
            {
                currentTask.AttemptCount++;
                if (currentTask.CanRun() || currentTask.AttemptCount >= currentTask.MaxAttempts)
                {
                    RunTask();
                }
            }
            else
            if (currentTask.CanRun())
            {
                RunTask();
            }
        }
コード例 #10
0
        public ResultObject Edit(DelayTask m)
        {
            if (string.IsNullOrEmpty(m.Url))
            {
                return(new ResultObject("url不能为空"));
            }

            if (m.Id > 0)
            {
                var flag = _delayTaskDao.Update(m, "Name", "Url", "Method", "PostData", "Enable",
                                                "TriggerTime", "MaxRetryCount", "RetrySeconds", "SuccessFlag", "TimeoutSeconds");
                return(new ResultObject(flag));
            }
            else
            {
                if (m.TriggerTime <= DateTime.Now)
                {
                    return(new ResultObject("触发时间不正确"));
                }

                var flag = _delayTaskDao.Insert(m);
                return(new ResultObject(flag));
            }
        }
コード例 #11
0
        /// <summary>
        /// Implementation of the *RequestWithRetry methods.
        /// </summary>
        /// <typeparam name="T">The result type of the task.</typeparam>
        /// <param name="retryOracle">The retry oracle.</param>
        /// <param name="impl">The task implementation.</param>
        /// <param name="setResult">The result report delegate.</param>
        /// <returns>A <see cref="TaskSequence"/> that performs the request with retries.</returns>
        internal static TaskSequence RequestWithRetryImpl <T>(ShouldRetry retryOracle, Func <Action <T>, TaskSequence> impl, Action <T> setResult)
        {
            int  retryCount  = 0;
            bool succeeded   = false;
            bool shouldRetry = false;

            do
            {
                var task = new InvokeTaskSequenceTask <T>(impl);
                yield return(task);

                TimeSpan delay = TimeSpan.FromMilliseconds(-1);

                try
                {
                    var result = task.Result;
                    succeeded = true;
                    setResult(result);
                }
                catch (TimeoutException e)
                {
                    shouldRetry = retryOracle != null?retryOracle(retryCount ++, e, out delay) : false;

                    // We should just throw out the exception if we are not retrying
                    if (!shouldRetry)
                    {
                        throw;
                    }
                }
                catch (StorageServerException e)
                {
                    if (e.StatusCode == HttpStatusCode.NotImplemented || e.StatusCode == HttpStatusCode.HttpVersionNotSupported)
                    {
                        throw;
                    }

                    shouldRetry = retryOracle != null?retryOracle(retryCount ++, e, out delay) : false;

                    // We should just throw out the exception if we are not retrying
                    if (!shouldRetry)
                    {
                        throw;
                    }
                }
                catch (InvalidOperationException e)
                {
                    //DataServiceClientException dsce = CommonUtils.FindInnerDataServiceClientException(e);

                    /*
                     * // rethrow 400 class errors immediately as they can't be retried
                     * // 501 (Not Implemented) and 505 (HTTP Version Not Supported) shouldn't be retried either.
                     * if (dsce != null &&
                     * ((dsce.StatusCode >= 400 && dsce.StatusCode < 500)
                     || dsce.StatusCode == (int)HttpStatusCode.NotImplemented
                     || dsce.StatusCode == (int)HttpStatusCode.HttpVersionNotSupported))
                     ||{
                     ||throw;
                     ||}*/

                    // If it is BlobTypeMismatchExceptionMessage, we should throw without retry
                    if (e.Message == SR.BlobTypeMismatchExceptionMessage)
                    {
                        throw;
                    }

                    shouldRetry = retryOracle != null?retryOracle(retryCount ++, e, out delay) : false;

                    // We should just throw out the exception if we are not retrying
                    if (!shouldRetry)
                    {
                        throw;
                    }
                }

                if (!succeeded && shouldRetry && delay > TimeSpan.Zero)
                {
                    using (DelayTask delayTask = new DelayTask(delay))
                    {
                        yield return(delayTask);

                        // Materialize exceptions
                        var scratch = delayTask.Result;
                        Console.WriteLine(scratch);
                    }
                }
            }while (!succeeded && shouldRetry);
        }
コード例 #12
0
 protected override Sims3.Gameplay.EventSystem.ListenerAction OnProcess(Sims3.Gameplay.EventSystem.Event e)
 {
     DelayTask.Perform(e, mFunc);
     return(Sims3.Gameplay.EventSystem.ListenerAction.Keep);
 }
コード例 #13
0
        private void Run(DelayTask task)
        {
            var hc = _httpClientFactory.CreateClient();

            hc.Timeout = task.TimeoutSeconds == 0
                ? TimeSpan.FromSeconds(15)
                : TimeSpan.FromSeconds(task.TimeoutSeconds);

            Task <HttpResponseMessage> requestTask;

            if (task.Method.Equals("GET", StringComparison.OrdinalIgnoreCase))
            {
                requestTask = hc.GetAsync(task.Url);
            }
            else
            {
                StringContent stringContent = new StringContent(task.PostData, Encoding.UTF8);
                requestTask = hc.PostAsync(task.Url, stringContent);
            }

            requestTask.ContinueWith(reqTask =>
            {
                var log = new ExecuteLog()
                {
                    PostData   = task.PostData,
                    TaskId     = task.Id,
                    TaskName   = task.Name,
                    TaskUrl    = task.Url,
                    TaskType   = 2,
                    TaskMethod = task.Method,
                };

                if (reqTask.IsFaulted)
                {
                    log.Status  = 2;
                    log.Message = reqTask.Exception.GetBaseException().StackTrace;
                    _executeLogDao.Insert(log);
                    _logger.LogError(reqTask.Exception.InnerExceptions.FirstOrDefault(),
                                     "执行DelayTask异常,id:{0},name:{1},url:{2}", task.Id, task.Name, task.Url);
                    ReJoin(task);
                }
                else if (reqTask.IsCanceled)
                {
                    log.Status  = 3;
                    log.Message = "timeout";
                    _executeLogDao.Insert(log);
                    ReJoin(task);
                }
                else
                {
                    reqTask.Result.Content.ReadAsStringAsync().ContinueWith(readTask =>
                    {
                        if (readTask.Result == task.SuccessFlag)
                        {
                            //删除数据
                            _delayTaskDao.DeleteById(task.Id);
                            log.Status  = 1;
                            log.Message = "success";
                            _executeLogDao.Insert(log);
                        }
                        else
                        {
                            log.Status  = 2;
                            log.Message = readTask.Result;

                            _logger.LogError("执行DelayTask出错,id:{0},name:{1},url:{2},msg:{3}", task.Id, task.Name,
                                             task.Url, readTask.Result);
                            _executeLogDao.Insert(log);
                            ReJoin(task);
                        }
                    });
                }
            });
        }
コード例 #14
0
        public ActionResult DelaySave(DelayTask m)
        {
            var ro = _delayTaskService.Edit(m);

            return(Json(ro));
        }