如何在不使用System.Timers.timer或System.Threading.timer的情况下在C#中创建计时

本文关键字:System timer 情况下 创建 Threading Timers | 更新日期: 2023-09-27 18:30:03

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

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

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

如何在不使用System.Timers.timer或System.Threading.timer的情况下在C#中创建计时

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

如果你只关心经过的时间,而不想使用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循环)

希望这能有所帮助!

我认为你可以做一些类似的事情:

public class MyTimer : MonoBehaviour
{
float myTime = 0.0f;
void Update()
{
UpdateTime();
}
public void UpdateTime()
{
myTime += Time.deltaTime;
}
}