Beispiel #1
0
        /// <summary>
        /// 主机停止监听
        /// </summary>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public Task StopAsync(CancellationToken cancellationToken)
        {
            // 清除所有任务
            SpareTime.Dispose();

            return(Task.CompletedTask);
        }
Beispiel #2
0
        /// <summary>
        /// 初始化一个简单任务
        /// </summary>
        /// <param name="jobName"></param>
        /// <returns></returns>
        public string InitJob(string jobName = "jobName")
        {
            Console.WriteLine("简单任务初始化");

            SpareTime.Do(1000, (t, i) =>
            {
                Console.WriteLine($"{t.WorkerName} -{t.Description} - {DateTime.Now:yyyy-MM-dd HH:mm:ss} - {i}");
            }, jobName, "模拟测试任务");
Beispiel #3
0
 private static void AddJobs()
 {
     SpareTime.Do("*/1 * * * *", (timer, count) =>
     {
         Scoped.Create((_, scope) =>
         {
             var services    = scope.ServiceProvider;
             var taskService = services.GetService <ITimedReminderJob>();
             $"Job Begin[{count}]-----------------------".LogInformation <Startup>();
             taskService.Do().Wait();
             $"Job End[{count}]-------------------------".LogInformation <Startup>();
         });
     }, "SyncSequence", "定时同步MES工序");
 }
Beispiel #4
0
        /// <summary>
        /// 添加任务调度服务
        /// </summary>
        /// <param name="services"></param>
        /// <returns></returns>
        public static IServiceCollection AddTaskScheduler(this IServiceCollection services)
        {
            // 查找所有贴了 [SpareTime] 特性的方法,并且含有一个参数,参数为 SpareTimer 类型
            var taskMethods = App.EffectiveTypes
                              // 查询符合条件的任务类型
                              .Where(u => u.IsClass && !u.IsInterface && !u.IsAbstract && typeof(ISpareTimeWorker).IsAssignableFrom(u))
                              // 查询符合条件的任务方法
                              .SelectMany(u =>
                                          u.GetMethods(BindingFlags.Public | BindingFlags.Instance)
                                          .Where(m => m.IsDefined(typeof(SpareTimeAttribute), false) &&
                                                 m.GetParameters().Length == 2 &&
                                                 m.GetParameters()[0].ParameterType == typeof(SpareTimer) &&
                                                 m.GetParameters()[1].ParameterType == typeof(long))
                                          .GroupBy(m => m.DeclaringType));

            if (!taskMethods.Any())
            {
                return(services);
            }

            // 遍历所有的 Worker
            foreach (var item in taskMethods)
            {
                if (!item.Any())
                {
                    continue;
                }

                // 创建任务对象
                var typeInstance = Activator.CreateInstance(item.Key);

                foreach (var method in item)
                {
                    // 判断是否是异步方法
                    var isAsyncMethod = method.IsAsync();

                    // 创建委托类型
                    var action = Delegate.CreateDelegate(isAsyncMethod ? typeof(Func <SpareTimer, long, Task>) : typeof(Action <SpareTimer, long>), typeInstance, method.Name);

                    // 获取所有任务特性
                    var spareTimeAttributes = method.GetCustomAttributes <SpareTimeAttribute>();

                    // 注册任务
                    foreach (var spareTimeAttribute in spareTimeAttributes)
                    {
                        switch (spareTimeAttribute.Type)
                        {
                        // 执行间隔任务
                        case SpareTimeTypes.Interval:
                            // 执行一次
                            if (spareTimeAttribute.DoOnce)
                            {
                                if (isAsyncMethod)
                                {
                                    SpareTime.DoOnce(spareTimeAttribute.Interval, (Func <SpareTimer, long, Task>)action, spareTimeAttribute.WorkerName, spareTimeAttribute.Description, spareTimeAttribute.StartNow, executeType: spareTimeAttribute.ExecuteType);
                                }
                                else
                                {
                                    SpareTime.DoOnce(spareTimeAttribute.Interval, (Action <SpareTimer, long>)action, spareTimeAttribute.WorkerName, spareTimeAttribute.Description, spareTimeAttribute.StartNow, executeType: spareTimeAttribute.ExecuteType);
                                }
                            }
                            // 不间断执行
                            else
                            {
                                if (isAsyncMethod)
                                {
                                    SpareTime.Do(spareTimeAttribute.Interval, (Func <SpareTimer, long, Task>)action, spareTimeAttribute.WorkerName, spareTimeAttribute.Description, spareTimeAttribute.StartNow, executeType: spareTimeAttribute.ExecuteType);
                                }
                                else
                                {
                                    SpareTime.Do(spareTimeAttribute.Interval, (Action <SpareTimer, long>)action, spareTimeAttribute.WorkerName, spareTimeAttribute.Description, spareTimeAttribute.StartNow, executeType: spareTimeAttribute.ExecuteType);
                                }
                            }
                            break;

                        // 执行 Cron 表达式任务
                        case SpareTimeTypes.Cron:
                            if (isAsyncMethod)
                            {
                                SpareTime.Do(spareTimeAttribute.CronExpression, (Func <SpareTimer, long, Task>)action, spareTimeAttribute.WorkerName, spareTimeAttribute.Description, spareTimeAttribute.StartNow, cronFormat: spareTimeAttribute.CronFormat == default ? default : (CronFormat)spareTimeAttribute.CronFormat, executeType: spareTimeAttribute.ExecuteType);
                            }
                            else
                            {
                                SpareTime.Do(spareTimeAttribute.CronExpression, (Action <SpareTimer, long>)action, spareTimeAttribute.WorkerName, spareTimeAttribute.Description, spareTimeAttribute.StartNow, cronFormat: spareTimeAttribute.CronFormat == default ? default : (CronFormat)spareTimeAttribute.CronFormat, executeType: spareTimeAttribute.ExecuteType);
                            }
                            break;

                        default:
                            break;
                        }
                    }
                }
            }

            return(services);
        }