【问题标题】:How to create a timer in C# without using System.Timers.Timer or System.Threading.Timer如何在 C# 中创建计时器而不使用 System.Timers.Timer 或 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 并解释列出的那些有什么问题(即为什么你不能使用它们)。
  • 我更新了问题的更多细节。

标签: c# unity3d timer system.timers.timer unity-webgl


【解决方案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 中使用它,所以这个解决方案对我不起作用。
    猜你喜欢
    • 2010-11-27
    • 2011-06-25
    • 1970-01-01
    • 2017-10-30
    • 2015-01-10
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多