以前,在进行循环任务时,它会在第一次完美运行并因为时间问题而分崩离析,例如一个单独任务的功能会比另一个任务开始运行得更快,即使它已被编程为在此之前任务。
所以我的想法是在延迟(时间)结束后想出一种重复任务事件的方法,在我的脑海中它会是这样的:
private async Task programCore()
{
int n = 1000;
for (int i = 0; i < n; )
{
FirstThing();
await Task.Delay(2100);
SecondThing();
await Task.Delay(2200);
ThirdThing();
await Task.Delay(2300);
}
////////////////////////////////////////////////////////////////////////////
else if (programCore.TasksHaveAllTimedOut) // Idealistic code.
{
programCore.Restart();
}
}
这样的事情可能吗?如果没有,有没有更好的方法呢?
答案 0 :(得分:7)
这个怎么样:
private async Task programCore()
{
int n = 1000;
for (int i = 0; i < n; )
{
await FirstThing();
await SecondThing();
await ThirdThing();
}
}
private async Task FirstThing()
{
// Do something here
}
private async Task SecondThing()
{
// Do something here
}
private async Task ThirdThing()
{
// Do something here
}
这会导致它运行FirstThing
,等待它完成,然后运行SecondThing
,等待它完成,然后最终运行ThirdThing
并等待它完成在重复循环之前。
答案 1 :(得分:5)
我相信@CodingGorilla有正确的想法。您的代码应如下所示(使用CancellationToken
s进行超时):
private async Task programCore()
{
int n = 1000;
for (int i = 0; i < n; ++i)
{
var timeout1 = new CancellationTokenSource(2100);
await FirstThingAsync(timeout1.Token);
var timeout2 = new CancellationTokenSource(2200);
await SecondThingAsync(timeout2.Token);
var timeout2 = new CancellationTokenSource(2300);
await ThirdThingAsync(timeout3.Token);
}
}
如果任何任务超过其超时,上面的代码将引发异常,这可能不是您想要的。如果您希望以不同方式处理此问题,可以捕获OperationCanceledException
。