Как создать таймер в C# без использования System.Timers.Timer или System.Threading.Timer

Можно ли создать таймер в C# без использования System.Timers.Timer или же System.Threading.Timer?

Я использую таймеры в проекте Unity (C#) и пытаюсь экспортировать проект WebGL. И потоки на данный момент не поддерживаются в экспорте Unity WebGL.

И кажется, что с помощью System.Timers.Timer > Elapsed Событие запускается в отдельном потоке. (?)

2 ответа

Таймер A 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;
}

}
Другие вопросы по тегам