你的想法很重要-大家都来谈 (C)Copyright 2012 by WeiPt

漫谈C#的定时执行程序

1、写法1 task的lambda表达式

 #region 写法1 task的lambda表达式
        //static void Main()
        //{
        //    // 创建并启动两个任务
        //    Task task1 = Task.Run(() => DoTask(1));
        //    Task task2 = Task.Run(() => DoTask(2));

        //    // 等待任务完成
        //    Task.WaitAll(task1, task2);

        //    Console.WriteLine("所有任务已完成。");
        //    // Console.ReadLine();
        //}

        //static void DoTask(int taskId)
        //{
        //    Console.WriteLine("任务 {0} 正在执行...", taskId);
        //    Thread.Sleep(2000); // 模拟任务执行时间
        //    Console.WriteLine("任务 {0} 已完成。", taskId);
        //}
        #endregion

  2、写法2 async/await关键字

        static async Task Main()
        {
            // 创建并启动两个任务
            Task task1 = DoTaskAsync(1);
            Task task2 = DoTaskAsync(2);

            // 等待任务完成
            await Task.WhenAll(task1, task2);

            Console.WriteLine("所有任务已完成。");
            Console.ReadLine();
        }

        static async Task DoTaskAsync(int taskId)
        {
            Console.WriteLine("任务 {0} 正在执行...", taskId);
            await Task.Delay(2000); // 模拟任务执行时间
            Console.WriteLine("任务 {0} 已完成。", taskId);
        }

  3、写法3 定时执行 每天18点

 #region 定时执行 每天18点

        static async Task Main()
        {
            Console.WriteLine("定时服务启动(每天18点)!当前时间:{0}", DateTime.Now);
            while (true)
            {
                // 计算当前时间距离下一个18点的时间间隔
                DateTime now = DateTime.Now;
                DateTime nextExecutionTime = new DateTime(now.Year, now.Month, now.Day, 18, 0, 0);
                if (now >= nextExecutionTime)
                {
                    nextExecutionTime = nextExecutionTime.AddDays(1);
                }
                TimeSpan timeUntilNextExecution = nextExecutionTime - now;

                // 等待到下一个18点
                await Task.Delay(timeUntilNextExecution);

                // 执行你的操作
                Console.WriteLine("定时任务触发了!当前时间:{0}", DateTime.Now);
            }
        }

        #endregion

  4、可以考虑使用第三方库,如Quartz.NET,它提供了更丰富的定时调度功能。

当然还有很多其他写法,欢迎讨论指导

posted @ 2023-09-13 08:43  weipt  阅读(1266)  评论(0编辑  收藏  举报

你的想法很重要-大家都来谈 (C)Copyright 2012 by WeiPt