You need to enable JavaScript to run this app. C# WinForm 每小时定时方法执行后如何让stime_log、etime_log时间各递增1小时
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 11:15:01