如何在 C# 中创建计时器而不使用 System.Timers.Timer 或 System.Threading.Timer
Posted
技术标签:
【中文标题】如何在 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.Timers.Timer 或 System.Threading.Timer的主要内容,如果未能解决你的问题,请参考以下文章