在一段时间内执行功能,以经过的时间作为参数

Posted

技术标签:

【中文标题】在一段时间内执行功能,以经过的时间作为参数【英文标题】: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();
);

【问题讨论】:

【参考方案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;

【讨论】:

以上是关于在一段时间内执行功能,以经过的时间作为参数的主要内容,如果未能解决你的问题,请参考以下文章

Python:只要条件为真,在一段时间内重复执行操作

C Windows API确定用户是不是在一段时间内不活动

如何在一段时间内重复一个过程,直到按下输入?

由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失%

Unity 动画系列十一 Animator Record 录制与回放

C#在一段数字区间内随机生成若干个互不相同的随机数