Winform/Csharp中使用定时器并设置每天指定多个时间段执行

场景

C#中实现计时器功能(定时任务和计时多长时间后执行某方法):

C#中实现计时器功能(定时任务和计时多长时间后执行某方法)_c# 每一秒减1_霸道流氓气质的博客-CSDN博客

前面讲的计时器的实现,如果需要一个Winform程序在每天的指定之间段内执行一次。

比如每天的交接班时间:7点50到8点之间、15点50到16点之间、23点50到24点之间分别执行一次定时任务。

注:

博客:
霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主

实现

1、时间段的间隔是10分钟,只要指定一个定时器检测当前时间是否位于以上时间区间内即可。

定时器执行的间隔需要小于10分钟,比如这里设置8分钟执行一次。

新增定时器并设置执行间隔

        //定时器
        Timer _timer = new Timer();
        //定时器执行时间间隔
        private int scheduleInterval = 1000 * 60 * 8;

2、设置定时器执行事件并启动定时器

                    _timer.Interval = scheduleInterval;
                    _timer.Tick += _timer_Tick;
                    _timer.Start();

3、在定时器执行事件中

        private void _timer_Tick(object sender, EventArgs e)
        {
            //如果当前是应该执行定时任务的时间段
            if (checkShoudStratTask()) {
                textBox_log.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":获取候车硐室车辆定时任务执行");
                textBox_log.AppendText("\r\n");
                getCarListData();
            }           
        }

调用检查当前事件是否位于指定时间间隔之内的方法

        private bool checkShoudStratTask() {

            //获取当前时间
            DateTime now = DateTime.Now;
            DateTime sevenClock50 = DateTime.Today.AddHours(7).AddMinutes(50);
            DateTime eightClock = DateTime.Today.AddHours(8);
            DateTime fifteen50 = DateTime.Today.AddHours(15).AddMinutes(50);
            DateTime sixteenClock = DateTime.Today.AddHours(16);
            DateTime twentyThree50 = DateTime.Today.AddHours(23).AddMinutes(50);
            DateTime twentyFour = DateTime.Today.AddHours(24);

            //如果大于7点50 且小于8点
            if ((sevenClock50 < now && now < eightClock) || (fifteen50 < now && now < sixteenClock) || (twentyThree50 < now && now < twentyFour) )
            {              
                return true;              
            }else
            {
                return false;
            }
        }

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Winform 导出多个数据到 Excel 表格并关闭,可以采用多线程的方式来提高执行效率。具体操作步骤如下: 1. 创建一个线程池,用于执行导出操作。 ```csharp int threadCount = Environment.ProcessorCount; //获取 CPU 核心数 ThreadPool.SetMaxThreads(threadCount, threadCount); //设置线程池最大线程数 ``` 2. 遍历数据源,为每个数据源创建一个线程,并将其加入到线程池。 ```csharp foreach (var dataSource in dataSources) { ThreadPool.QueueUserWorkItem(state => { ExportToExcel(dataSource, filePath); Interlocked.Decrement(ref runningThreadCount); //线程执行完毕,运行线程数减1 }); Interlocked.Increment(ref runningThreadCount); //新建线程,运行线程数加1 } ``` 3. 在 UI 线程,等待所有导出操作执行完毕,并关闭 Excel 进程。 ```csharp while (runningThreadCount > 0) { Application.DoEvents(); //让主线程处理消息 } excelApp.Quit(); //关闭 Excel 进程 ``` 完整的代码示例如下: ```csharp using System; using System.Collections.Generic; using System.IO; using System.Threading; using Microsoft.Office.Interop.Excel; using NPOI.HSSF.UserModel; //定义数据源 public class Person { public string Name { get; set; } public int Age { get; set; } public string Gender { get; set; } } public static void ExportToExcel(Person[] dataSource, string filePath) { //创建一个 Excel 文件并设置其属性 HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.CreateSheet("Sheet1"); //创建表头信息 HSSFRow headerRow = sheet.CreateRow(0); headerRow.CreateCell(0).SetCellValue("姓名"); headerRow.CreateCell(1).SetCellValue("年龄"); headerRow.CreateCell(2).SetCellValue("性别"); //遍历数据源,将数据写入到 Excel 文件 for (int i = 0; i < dataSource.Length; i++) { HSSFRow dataRow = sheet.CreateRow(i + 1); dataRow.CreateCell(0).SetCellValue(dataSource[i].Name); dataRow.CreateCell(1).SetCellValue(dataSource[i].Age); dataRow.CreateCell(2).SetCellValue(dataSource[i].Gender); } //将 Excel 文件保存到本地 using (FileStream fileStream = new FileStream(filePath, FileMode.Create)) { workbook.Write(fileStream); } } public static void ExportToExcel(List<Person[]> dataSources, string folderPath) { //创建 Excel 应用程序对象 Application excelApp = new Application(); excelApp.DisplayAlerts = false; //禁止 Excel 弹出警告框 int threadCount = Environment.ProcessorCount; //获取 CPU 核心数 ThreadPool.SetMaxThreads(threadCount, threadCount); //设置线程池最大线程数 int runningThreadCount = 0; //记录正在运行的线程数 //遍历数据源,为每个数据源创建一个线程,并将其加入到线程池 foreach (var dataSource in dataSources) { string fileName = Guid.NewGuid().ToString() + ".xls"; //生成一个随机文件名 string filePath = Path.Combine(folderPath, fileName); //生成文件的完整路径 ThreadPool.QueueUserWorkItem(state => { ExportToExcel(dataSource, filePath); Interlocked.Decrement(ref runningThreadCount); //线程执行完毕,运行线程数减1 }); Interlocked.Increment(ref runningThreadCount); //新建线程,运行线程数加1 } //在 UI 线程,等待所有导出操作执行完毕,并关闭 Excel 进程 while (runningThreadCount > 0) { Application.DoEvents(); //让主线程处理消息 } excelApp.Quit(); //关闭 Excel 进程 } ``` 通过多线程的方式,可以同时处理多个数据源的导出操作,从而提高执行效率。需要注意的是,在使用多线程的情况下,我们需要在 UI 线程等待所有操作执行完毕,再关闭 Excel 进程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

霸道流氓气质

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值