代码之家  ›  专栏  ›  技术社区  ›  j4nw

在一段时间内执行一个函数,时间作为参数

  •  0
  • j4nw  · 技术社区  · 6 年前

    我想用经过的时间作为一个参数(具体来说,lerp是外部硬件设备的一个配置值)在几秒钟内执行一些操作。实现这一目标的直接方法是什么?我有点迷失在C可以做线程和计时器的所有方式中。

    这是我到目前为止所拥有的,但看起来很笨拙,而且很可能是错的。

    System.Threading.Tasks.Task.Run(async () =>
    {
        var timeToRun = 5000; // in milliseconds
        var timer = new System.Timers.Timer();
        var startTime = DateTime.Now;
        timer.Elapsed += (s, e) =>
        {
            var elapsedTime = e.SignalTime - startTime;
            var normalizedTime = elapsedTime.TotalMilliseconds / timeToRun;
            someValue = Lerp(from, to, normalizedTime);
        };
        timer.Start();
        await System.Threading.Tasks.Task.Delay(timeToRun);
        timer.Stop();
    });
    
    0 回复  |  直到 6 年前
        1
  •  1
  •   Vlad    6 年前

    我想用一种简单的异步方法:

    async Task Loop(int timeInMs, int iterationTimeInMs)
    {
        for (int current = 0; current < timeInMs; current += iterationTimeInMs)
        {
            await Task.Delay(iterationTimeInMs);
            var normalizedTime = current / (double)timeInMs;
            someValue = Lerp(from, to, normalizedTime);
        }
    }
    

    如果你的 Lerp 可能需要很长时间

    async Task Loop(int timeInMs, int iterationTimeInMs)
    {
        Task taskFromLastIteration = null;
        for (int current = 0; current < timeInMs; current += iterationTimeInMs);
        {            
            var delay = Task.Delay(iterationTimeInMs); // start delay now
            if (taskFromLastIteration != null)
                someValue = await taskFromLastIteration;
            await delay;
            var normalizedTime = current / (double)timeInMs;
            taskFromLastIteration = Task.Run(() => Lerp(from, to, normalizedTime));
        }
        if (taskFromLastIteration != null)
            someValue = await taskFromLastIteration;
    }