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."); } }
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); }