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();
这三条后来测试用的,不是原来代码
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.Timer
或System.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# 在同一线程上运行代码