如何在 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.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.Timers.Timer 或 System.Threading.Timer的主要内容,如果未能解决你的问题,请参考以下文章

使用 System.IO.Packaging 在 c# 中创建 zip

C# String与StringBuilder

如何在 kivy 中创建 60 秒倒数计时器

在 Windows 中创建 C++ 非阻塞计时器

在内存中创建 eml 文件而不将其保存在磁盘上

如何在 Netbeans 中创建 Java 项目,而不使用 Maven 作为默认值?