C# System.Threading.Timer如何停止

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# System.Threading.Timer如何停止相关的知识,希望对你有一定的参考价值。

using System;
using System.Threading;

namespace Reminder

public class Reminder

public Timer stateTimer;
public void Check()

AutoResetEvent autoEvent = new AutoResetEvent(false);
StatusChecker statusChecher = new StatusChecker();
TimerCallback tcb = statusChecher.CheckInventory;
stateTimer = new Timer(tcb, autoEvent, 1000, 5000);
//autoEvent.WaitOne(1, false);
stateTimer.Change(5000, 1000);
stateTimer.Dispose();



class StatusChecker

public void CheckInventory(object stateInfo)

AutoResetEvent autoEvent = (AutoResetEvent)stateInfo;
int inventoryShortageCount = 5;
if (inventoryShortageCount > 0)

System.Windows.Forms.MessageBox.Show("");





在Form里面调用
private void Form1_Load(object sender, EventArgs e)

Reminder r = new Reminder();
r.Check();
//r.stateTimer.Dispose();
//如果这样,Timer就直接被Dispose掉了,如何才能在Form里面随意停止Timer

autoEvent.WaitOne(1, false);
stateTimer.Change(5000, 1000);
stateTimer.Dispose();
这三条后来测试用的,不是原来代码

Threading.Timer 属于100% 多线程
Timers.Timer 默认多线程,可设置为单线程
既然是多线程,不管通过回调 还是事件 执行任务,都是开启的另一个线程;
你可以暂停或销毁计时器(Timer)本身,但是不能操作里面新开线程的任务,这也是多线程设计的期望方式,因为你不知道 超线程里面到底执行到哪儿了。
但是,像我这种(刁民)有时候就喜欢那么横,所以就把 新开的任务装在一个 new Thread()里面,这样就可以操作这个线程了,(到时只需要暴力abort() 终止这个线程就行)。

Threading.Timer 暂停: Change(-1,任意值); 启动: Change(大于等于0,时间间隔);
Timers.Timer 暂停: Stop(); 启动:Start();
再次提醒,这里暂停的意思是 计时器不在重新启动,不是终止计时器的里面任务。
参考技术A stateTimer.Change(-1, 任意值);就可以停止。
Threading.Timer 没有Enabled属性。
参考技术B timer.stop()调用停止的方法呀,timer.start()开始 开始和停止是对应的呀 参考技术C timer enabled属性改为false试试。 参考技术D stateTimer.Enable=false;
stateTimer.Dispose();

如何在 C# 中创建计时器而不使用 System.Timers.Timer 或 System.Threading.Timer

【中文标题】如何在 C# 中创建计时器而不使用 System.Timers.Timer 或 System.Threading.Timer【英文标题】:How to create a timer in C# without using System.Timers.Timer or System.Threading.Timer 【发布时间】:2016-04-17 07:41:57 【问题描述】:

是否可以在不使用System.Timers.TimerSystem.Threading.Timer 的情况下在C# 中创建计时器?

我在 Unity 项目 (C#) 中使用计时器,并且正在尝试导出 WebGL 项目。 Unity WebGL 导出中暂时不支持线程。

似乎使用System.Timers.Timer > Elapsed 事件在单独的线程上运行。 (?)

【问题讨论】:

如果还有另一个Timer ? 是的,有可能。只需使用System.Windows.Forms.Timer ;) 能告诉我们这个问题的原因和目的吗? 为你定义什么是 timer 并解释列出的那些有什么问题(即为什么你不能使用它们)。 我更新了问题的更多细节。 【参考方案1】:

C# Timer 能够在指定的时间过去后触发回调函数,从而在单独的线程中运行检查。

如果您只关心经过的时间量并且不想使用 Unity 的 Time.deltaTime 功能,则可以使用 DateTime 来跟踪时间。这是一个提供此行为的基本示例类。

public class SimpleTimer

    private DateTime StartTime;
    private DateTime LastTime;
    private bool running;

    public double ElaspedTime  get  return GetElapsedTime();  

    public void Start()
    
        StartTime = DateTime.Now;
        running = true;
    

    public void Restart()
    
        Start();
    

    public double GetElapsedTime()
    
        if (!running)
            throw new Exception("SimpleTimer not running! Must call Start() prior to querying the Elapsed Time.");

        LastTime = DateTime.Now;
        var elaspedTime = LastTime - StartTime;

        return elaspedTime.TotalMilliseconds;
    

    public double GetElapsedTimeAndRestart()
    
        var elaspedTime = GetElapsedTime();
        Restart();

        return elaspedTime;
    

...这里是一个使用示例:

var timer = new SimpleTimer();
timer.Start();

//Prints the total time each iteration
for(var i = 1; i <=1000; i++)

    System.Threading.Thread.Sleep(5);
    Console.WriteLine("Loop " + i + ": Elasped Time = " + timer.ElaspedTime + " ms");


timer.Restart();

//Prints roughly 5ms each iteration
for (var i = 1; i <= 1000; i++)

    System.Threading.Thread.Sleep(5);                
    Console.WriteLine("Loop " + i + ": Elasped Time = " + timer.ElaspedTime + " ms");
    timer.Restart();

这可以扩展为在达到所需的经过时间后调用函数,但是您需要在代码中的某个位置调用检查方法,该位置会经常且一致地运行。 (就像在 FSM 循环中一样)

希望这会有所帮助!

【讨论】:

【参考方案2】:

我认为你可以这样做:

public class MyTimer : MonoBehaviour

float myTime = 0.0f;
void Update()

UpdateTime();


public void UpdateTime()

myTime += Time.deltaTime;



【讨论】:

我不在 MonoBehaviour 中使用它,所以这个解决方案对我不起作用。

以上是关于C# System.Threading.Timer如何停止的主要内容,如果未能解决你的问题,请参考以下文章

C# 中的 System.Threading.Timer 似乎无法正常工作。它每 3 秒运行一次非常快

如何使用 System.Threading.Timer c# 在同一线程上运行代码

如何停止 System.Threading.Timer,然后更改其参数并再次运行? [复制]

关于C#中timer类

C#中Timer定时器的使用示例

C#三种定时器的实现