C# WinForm 每小时定时方法执行后如何让stime_log、etime_log时间各递增1小时
实现方案
前置注意事项
- 当前使用的
System.Timers.Timer的Elapsed事件回调运行在线程池的非UI线程,直接修改stime_log、etime_log的Text属性会触发跨线程访问异常,必须切回UI线程操作控件 - 时间解析环节要加格式容错,避免文本框内容被手动修改为非标准日期格式时程序直接崩溃
- 时间递增逻辑必须放在所有业务操作(读设备日志、写数据库)全部执行完成之后再触发,避免出现业务还没跑完文本框时间就提前跳转的时序问题
具体代码修改
找到原有thisTime方法,在所有业务逻辑(DataTable填充、SDK读日志、MySQL插入)执行完成的位置,加上时间偏移和UI更新逻辑,修改后的完整方法参考:
private void thisTime(object source, ElapsedEventArgs e) { if (!checkBox_timePeriod.Checked) return; string fromTime = stime_log.Text.Trim(); string toTime = etime_log.Text.Trim(); // ---- 以下为原有业务逻辑,保持不变 ---- DataTable dt_periodLog = new DataTable("dt_periodLog"); gv_Attlog.AutoGenerateColumns = true; gv_Attlog.Columns.Clear(); dt_periodLog.Columns.Add("User ID", typeof(string)); dt_periodLog.Columns.Add("Verify Date", typeof(string)); dt_periodLog.Columns.Add("Verify Type", typeof(int)); dt_periodLog.Columns.Add("Verify State", typeof(int)); dt_periodLog.Columns.Add("WorkCode", typeof(int)); gv_Attlog.DataSource = dt_periodLog; DataMng.SDK.sta_readLogByPeriod(DataMng.lbSysOutputInfo, dt_periodLog, fromTime, toTime); string MyConnection2 = "datasource=local;Port=3305;Database=sik_gi_new;Uid=root;Pwd="; string ip = "192.168.10.19"; string Query = "insert into dvc0006(NIK,Enroll,deviceIP) value(@NIK,@tgl,@ip)"; foreach (DataRow r in dt_periodLog.Rows) { using (MySqlConnection conn = new MySqlConnection(MyConnection2)) { using (MySqlCommand cmd = new MySqlCommand(Query, conn)) { cmd.Parameters.AddWithValue("@NIK", r["User ID"]); cmd.Parameters.AddWithValue("@tgl", r["Verify Date"]); cmd.Parameters.AddWithValue("@ip", ip); conn.Open(); cmd.ExecuteNonQuery(); } } } // ---- 原有业务逻辑结束 ---- // 新增:业务全部执行完成后,切回UI线程更新两个文本框的时间 this.Invoke(new Action(() => { // 解析stime_log的当前时间,偏移1小时 if (DateTime.TryParse(stime_log.Text.Trim(), out DateTime newStart)) { // 如果是DateTimePicker控件,直接用自带的CustomFormat匹配原有展示格式 stime_log.Text = newStart.AddHours(1).ToString(stime_log.CustomFormat); } // 解析etime_log的当前时间,偏移1小时 if (DateTime.TryParse(etime_log.Text.Trim(), out DateTime newEnd)) { etime_log.Text = newEnd.AddHours(1).ToString(etime_log.CustomFormat); } })); }
补充说明
- 如果使用的是普通Textbox而非
DateTimePicker控件,把上述代码里的.ToString()部分替换为项目统一使用的日期时间格式字符串即可,保证加完小时后的展示格式和原有逻辑一致 - 固定每小时触发的场景下,当前Timer的
AutoReset = true配置完全够用,不需要额外调整触发间隔
内容的提问来源于stack exchange,提问作者reja eja
相关产品推荐
相关产品推荐

