【发布时间】:2020-09-03 03:39:10
【问题描述】:
我有这个方法 ExecuteAllAsync() 它使用字段 List jobs 并异步执行 list 中的所有作业。我想设置一个超时来终止作业并在需要很长时间或不再需要时停止执行。我尝试在以下代码中这样做:
//Execute all jobs async
public async void ExecuteAllAsync()
{
if (jobs.Count()==0)
return;
List<Task> tasks = new List<Task>();
foreach (Job job in jobs.ToArray())
{
int timeout = 500;
Task t = Task.Run(() => {
ExecuteJob(job) // Do Work Here
});
tasks.Add(t);
if (!t.Wait(timeout))
//Log Timeout Error
}
await Task.WhenAll(tasks);
}
这不起作用。我还尝试将 Thread.Sleep(1000) 放入 ExecuteJob() 函数中以使所有任务超时,结果是只有一些作业超时,而一些作业完全执行。我还使用秒表来检查这项工作需要多长时间,我发现其中一些需要超过 1 秒。
目前超时设置为 500 毫秒,但未来每个任务将有不同的超时值:
int timeout = (int)(job.TimeToKill() - DateTime.Now).TotalMilliseconds
如何在为每个任务设置超时的同时异步执行列表中的所有作业? 提前致谢。
【问题讨论】:
-
什么意思?
-
我的意思是这可能是重复的。并且不清楚必须在哪里设置超时?对于所有任务或每个单独的
Task?例如,您为每个设置超时 1 秒,所有作业开始将在 500 毫秒内执行。然后你会在 1.5 秒内完成。或者您想为所有作业执行设置超时,然后终止所有未及时完成的作业?顺便说一句,async方法中的t.Wait()是错误的,可能会导致在等待时锁定主 UI 线程。 -
ExecuteJob方法是否接受CancellationToken作为参数?如果没有,就没有干净的方法来终止任务。你可能会想到Thread.Abort,但这是no-no,在.NET Core 中也不支持。 -
@RonD 的回答不能满足您的问题?否则请接受一个。
标签: c# multithreading asynchronous async-await timeout