给出下面的代码,当所有任务都运行完成而不阻塞线程时,通知使用者的最优雅的方法是什么?目前,我有一个使用计数器的解决方案,该计数器在Error in .local(drv, ...) :
Failed to connect to database: Error: Can't connect to MySQL server on 'localhost' (0)
之前递增,在Execute(action)
和Continuation()
之后递减。如果计数器为零,则可以假定没有更多的任务正在处理。
答案 0 :(得分:3)
首先,完全不要使用Task
构造函数。如果要在线程池线程中运行委托,请使用Task.Run
。接下来,不要使用ContinueWith
,而要使用await
向任务添加延续。这样,编写正确的代码容易得多,特别是在适当的错误处理方面。您的代码最有效地写为:
try
{
await Task.Run(() => Execute(action));
Continuation();
}
catch(Exception e)
{
LogExceptions(e)
}
finally
{
CustomLogging();
}