在一段时间内执行功能,以经过的时间作为参数
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;
【讨论】:
以上是关于在一段时间内执行功能,以经过的时间作为参数的主要内容,如果未能解决你的问题,请参考以下文章
由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失%