在所有任务完成而没有阻塞线程的情况下通知使用者

时间:2018-12-13 14:25:39

标签: c# .net multithreading asynchronous task

给出下面的代码,当所有任务都运行完成而不阻塞线程时,通知使用者的最优雅的方法是什么?目前,我有一个使用计数器的解决方案,该计数器在Error in .local(drv, ...) : Failed to connect to database: Error: Can't connect to MySQL server on 'localhost' (0) 之前递增,在Execute(action)Continuation()之后递减。如果计数器为零,则可以假定没有更多的任务正在处理。

1 个答案:

答案 0 :(得分:3)

首先,完全不要使用Task构造函数。如果要在线程池线程中运行委托,请使用Task.Run。接下来,不要使用ContinueWith,而要使用await向任务添加延续。这样,编写正确的代码容易得多,特别是在适当的错误处理方面。您的代码最有效地写为:

try
{
    await Task.Run(() => Execute(action));
    Continuation();    
}
catch(Exception e)
{
    LogExceptions(e)
}
finally
{
    CustomLogging();
}