Пример #1
0
 public void EndRequest(Guid token, string callName = "")
 {
     if (TaskStatus.ContainsKey(token))
     {
         TaskStatus.Remove(token);
         SetDatabaseStatus();
     }
     else
     {
         throw new InvalidOperationException("Database request " + callName + " can not be finished! No active request on the database found.");
     }
 }
Пример #2
0
 protected virtual async Task <bool> StartUpdateWhenReady(UpdateKind updateKind, Guid token, [CallerMemberName] string callName = "")
 {
     if (callName != "")
     {
         CurrentUpdateMethod = callName;
         if (TaskStatus.ContainsKey(token))
         {
             TaskStatus[token] = updateKind;
         }
         else
         {
             TaskStatus.Add(token, updateKind);
         }
         SetDatabaseStatus();
     }
     return(await Task.FromResult(true));
 }
Пример #3
0
        private bool Execute(TimedTask task, TypeInfo clazz, MethodInfo method)
        {
            var identifier = task.Identifier;

            if (task.ExpireTime != default(DateTime) &&
                task.ExpireTime <= DateTime.Now)
            {
                //已过期失效
                StaticTimers[task.Id].Dispose();
                TaskStatus[task.Id] = false;
                StaticTimers.Remove(task.Id);
                TaskStatus.Remove(task.Id);
                return(false);
            }
            var argtypes = clazz.GetConstructors()
                           .First()
                           .GetParameters()
                           .Select(x =>
            {
                if (x.ParameterType == typeof(IServiceProvider))
                {
                    return(services);
                }
                else
                {
                    return(services.GetService(x.ParameterType));
                }
            }).ToArray();

            var instance       = Activator.CreateInstance(clazz.AsType(), argtypes);
            var paramtypes     = method.GetParameters().Select(x => services.GetService(x.ParameterType)).ToArray();
            var singleTaskAttr = method.GetCustomAttribute <SingleTaskAttribute>(true);

            lock (this)
            {
                if (!IsEnable)
                {
                    return(false);
                }
                if (singleTaskAttr != null && singleTaskAttr.IsSingleTask &&
                    TaskStatus.ContainsKey(task.Id) && TaskStatus[task.Id])
                {
                    return(false);
                }
                TaskStatus[task.Id] = true;
            }

            var dtStart = DateTime.Now;

            try
            {
                if (IsZh)
                {
                    logger?.LogInformation($"[事务]{task.Name} 开始执行...");
                }
                else
                {
                    logger?.LogInformation($"[Task]{task.Name} Invoking...");
                }
                Stopwatch sw = new Stopwatch();
                sw.Start();
                method.Invoke(instance, paramtypes);
                sw.Stop();
                var dtEnd = DateTime.Now;
                if (IsZh)
                {
                    logger?.LogInformation($"[事务]{task.Name} 执行结束,耗时{sw.ElapsedMilliseconds}毫秒。");
                }
                else
                {
                    logger?.LogInformation($"[Task]{task.Name} Finish, takes {sw.ElapsedMilliseconds} milliseconds.");
                }
                Debug.WriteLine($"[Task]{task.Name} Finish, takes {sw.ElapsedMilliseconds} milliseconds.");

                //写数据库log
                if (timedTaskLogProvider != null)
                {
                    Task.Factory.StartNew(() =>
                    {
                        TimedTaskLog log = new TimedTaskLog();
                        log.TaskId       = task.Id;
                        log.BeginTime    = dtStart;
                        log.EndTime      = dtEnd;
                        log.Duration     = sw.ElapsedMilliseconds;
                        log.Result       = "success";
                        timedTaskLogProvider.AddLog(log);
                    });
                }
            }
            catch (Exception ex)
            {
                if (timedTaskLogProvider != null)
                {
                    Task.Factory.StartNew(() =>
                    {
                        TimedTaskLog log = new TimedTaskLog();
                        log.TaskId       = task.Id;
                        log.BeginTime    = dtStart;
                        log.EndTime      = DateTime.Now;
                        log.Duration     = Convert.ToInt64((dtStart - DateTime.Now).TotalMilliseconds);
                        log.Result       = "fail";
                        timedTaskLogProvider.AddLog(log);
                    });
                }

                logger?.LogError(ex.ToString());
            }
            TaskStatus[task.Id] = false;
            return(true);
        }