Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在一段时间内执行一项功能,并将时间作为参数_C#_Multithreading_Timer - Fatal编程技术网

C# 在一段时间内执行一项功能,并将时间作为参数

C# 在一段时间内执行一项功能,并将时间作为参数,c#,multithreading,timer,C#,Multithreading,Timer,我希望在几秒钟内执行一些操作,将经过的时间作为参数(具体来说,lerp是外部硬件设备的配置值)。实现这一目标的简单方法是什么?我对C#可以处理线程和计时器的所有方法都有点迷茫 到目前为止,这就是我所拥有的,但它似乎笨重,而且可能是错误的 System.Threading.Tasks.Task.Run(async () => { var timeToRun = 5000; // in milliseconds var timer = new System.Timers.Tim

我希望在几秒钟内执行一些操作,将经过的时间作为参数(具体来说,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();
});

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

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