我有一个功能很多,并且是CPU密集型的...基本上我有很多文件需要相当多的处理。所以我开始处理这些问题。这是一些伪代码。
bool DoWork(FileInfo fi)
{
// do lots of work
}
static Task<bool> DoWorkAsync(FileInfo fi)
{
return Task.Run(() => DoWork(fi));
}
void Main()
{
DirectoryInfo di = new DirectoryInfo(somePath);
List<FileInfo> files = di.GetFiles("*.txt"); // grab all text files in path
List<Task<bool>> tasks = new List<Task<bool>>();
foreach (FileInfo fi in files)
{
tasks.Add(DoWorkAsync(fi));
}
Task.WhenAll();
}
但是,如果一个任务抛出异常,我不希望它影响其他任务的生成。我确实希望了解它的日志记录和处理目的,但我想在最后(WhenAll
调用之后)收集成功的结果和例外。
更新根据以下评论,建议我使用WaitAll
,这将引发AggregateException
。但是我仍然看到没有被发现的行为。修改我的代码看起来像下面的
bool DoWork(FileInfo fi) { throw new NotImplementedException();}
然后将WaitAll
包裹起来
try
{
Task.WaitAll(tasks.ToArray());
}
catch (AggregateException aggregateException)
{
//handle this
}