【问题标题】:Perform a function over some time, with time elapsed as parameter在一段时间内执行功能,以经过的时间作为参数
【发布时间】:2019-07-08 13:31:25
【问题描述】:

我想在几秒钟内执行某些操作,并将经过的时间作为参数(特别是,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();
});

【问题讨论】:

    标签: c# multithreading timer


    【解决方案1】:

    我会选择一种简单的异步方法:

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-29
      • 1970-01-01
      • 2017-11-20
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      相关资源
      最近更新 更多