winform c# 如写一个定时开始,结束的时间代码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了winform c# 如写一个定时开始,结束的时间代码相关的知识,希望对你有一定的参考价值。

现在我有一个 Test方法 例如: protected void Test() //执行代码
怎么写一个点击按钮判断开始,结束时间,执行间隔5分钟执行Test的方法。
说明一下:
1:点击“启用“按钮后,判断当前系统时间和设定的时间,是否在有效范围内,
2:在第一个条件满足的情况下,每隔5分钟执行方法。
3:到达结束时间,自动停止,不再执行方法。

用Thread或Timer控件,Thread:

            Console.WriteLine("开始时间:" + DateTime.Now.ToString("HH:mm:ss"));

            Console.WriteLine("5s後启动test()方法:");

            Thread.Sleep(5000);

            Console.WriteLine("结束时间:" + DateTime.Now.ToString("HH:mm:ss"));

            test();

参考技术A

你后面又加要求了,代码就不一样了。

这里要使用Timer和Thread线程。下面是代码:


Timer timer;
//启动按钮
private void button1_Click(object sender, EventArgs e)

    DateTime timeBegin = dateTimePicker1.Value;
    DateTime timeEnd = dateTimePicker2.Value;
    while(true)
    
        DateTime now = DateTime.Now;
        if (now >= timeBegin && now <= timeEnd)
        
            timer = new Timer();
            timer.Interval = 1000 * 60 * 5;
            timer.Tick += new System.EventHandler(Test);
            timer.Start();
            break;
        
        System.Threading.Thread.Sleep(200);//休眠200毫秒判断一次时间
    
            

//停止按钮
private void button2_Click(object sender, EventArgs e)

    timer.Stop();

private void Test(object sender, EventArgs e)

    DateTime timeBegin = dateTimePicker1.Value;
    DateTime timeEnd = dateTimePicker2.Value;
    DateTime now = DateTime.Now;
    if (now >= timeBegin && now <= timeEnd)
    
        //要做的事情
    
    else
    
        timer.Stop();
    

注意Test方法需按上面来写,原来的代码写在“要做的事情”这里。

追问

谢谢您提供的方案,现在我想问这这个Threading启动后,怎么放在后台。窗口卡不不动了,非到有效时间。

追答

奥,这样的话启动按钮里的代码,要另外写成一个线程。

追问

就是启动后假死了,要怎么办?

追答

就是因为程序中下面这句,使程序进程停止,产生假死情况:
System.Threading.Thread.Sleep(200);

解决办法吧启动按钮里的代码,改用一个新进程运行就好了。

本回答被提问者和网友采纳
参考技术B 定时器可以满足你的需要

C# winform 两个定时器访问同一个变量

【中文标题】C# winform 两个定时器访问同一个变量【英文标题】:C# winform Two timers access same variable 【发布时间】:2020-04-07 09:59:49 【问题描述】:

我是 C# 新手,我正在做一个项目,需要两个计时器同时访问同一个变量。(一个用于读取,另一个用于写入或更新)。所以,我的问题是 我应该使用哪个定时器? Forms.Timer 或 Thread.Timer。我读过一些关于它们区别的文章。由于我想使用这些计时器来更新程序的界面(图片框中的图像),所以我认为 Forms.Timer 应该在这里使用,因为它与 GUI 的东西有关。但是,哪个计时器首先执行的顺序也很重要,所以我认为 Thread.Timer 也应该考虑。有什么办法可以将它们组合在一起吗?

更新:我正在做一个心电图项目,所以基本上我一直在接收数据,我想在表格上绘制它们。但是,由于绘制大约需要 40 毫秒,所以使用一个计时器会有延迟,但我需要实时。(例如,如果我将间隔设置为 100 毫秒,那么完成应该完成的一帧绘制需要 140 毫秒100 毫秒。这将导致每个滴答声延迟 40 毫秒。)因此,我的解决方案是在我收到数据时使用一个计时器更新数据缓冲区,并使用另一个计时器调用 Invalidate,这将重新绘制所有新数据。我应该使用 thread.timer 来更新数据并使用 form.timer 来重绘表单吗?

【问题讨论】:

你是什么意思“计时器首先执行的顺序也很重要?”您是否希望这两个计时器同时触发,并且需要按特定顺序处理事件? 您应该坚持使用 WinForms 特定的计时器。您不必通过这种方式通过锁来控制对变量的访问。 你的程序到底在做什么?听起来可能有更好的模式。 @Rufus L,您好,我刚刚编辑了我的问题,您能给我提供任何建议或更好的解决方案吗 补充@Jimi 所说的内容。让它顺利运行的诀窍是在 Paint 处理程序中进行绘图,然后仔细管理 Invalidation 区域。在传入数据到达时对其进行处理,然后仅使需要更新的区域无效。一段时间后,将调用您的 Paint 例程。只有无效的区域会被更新 【参考方案1】:

两个定时器的主要区别在于Form.TimerForm在同一个线程中工作,因此Tick事件访问或更改任何GUI组件(控件等)的状态都没有问题处理程序代码。在Thread.Timer 的情况下,不能保证TimerCallback 方法是从当前线程调用的(可以,但不是必须),因此访问GUI 组件可能有点困难且不容易(必须使用@ 987654327@,喜欢这里:Accessing a form's control from a separate thread)。另一方面,在Form.Timer.Tick 处理程序中实现的任何长期和密集处理都将在与GUI 相同的线程中执行,因此会降低GUI 效率和责任感。因此,一般规则是:对于 GUI 组件的快速、短期操作,使用Form.Timer,而对于不需要访问 GUI 组件的长期、繁重的计算,使用Thread.Timer。当然,这是一个简化的规则——最终的决定应视具体情况而定。

【讨论】:

所以,我应该使用 thread.Timer 来更新数据缓冲区,因为它需要更多的计算,并使用 form.Timer 来重新绘制表单,对吗?还有一个问题是它们是否在同一个线程上运行? 对。关于运行线程,正如我所写:Form.Timer.Tick 事件处理程序将在 GUI 线程上工作,而 Thread.Timer.TimerCallback 主要而且通常在不同于 GUI 的线程上工作。

以上是关于winform c# 如写一个定时开始,结束的时间代码的主要内容,如果未能解决你的问题,请参考以下文章

C#开发的winform程序,窗体打开的速度很慢,请高手指点。。谢了先。。。

.net C# winform程序定时运行代码

C#:在winform上使用定时器来改变图表,定时器需要单独的方法,图表数据不能从单独的方法中编辑

C# WinForm 文本框离开焦点事件 问题???

C# winForm 定时拷贝覆盖文件小工具

C#中winform的timer控件定时弹窗后,会弹出多个同样的窗口?