use*_*620 1 c# multithreading task async-await
以前,在进行循环任务时,它会在第一次运行时完全运行并因为时间问题而分崩离析,例如一个单独任务的功能将比另一个任务开始运行得更快,即使它被编程为在该任务之前.
所以我的想法是找出一种方法,一旦延迟(时间)结束就重复一项任务的事件,在我的脑海中,它会是这样的:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
这样的事情可能吗?如果没有,有没有更好的方法呢?
这个怎么样:
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
}
Run Code Online (Sandbox Code Playgroud)
这有效,它运行FirstThing,等待它完成,然后运行SecondThing,等待它完成,然后最终运行ThirdThing并等待它完成重复循环.
我相信@CodingGorilla有正确的想法.你的代码看起来像这样(用CancellationTokens表示超时):
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);
}
}
Run Code Online (Sandbox Code Playgroud)
如果任何任务超过其超时,上面的代码将引发异常,这可能不是您想要的.OperationCanceledException如果您希望以不同方式处理此问题,您可以抓住它.
| 归档时间: |
|
| 查看次数: |
1679 次 |
| 最近记录: |