在C#中处理并发Task.Run调用时出错

时间:2016-06-03 20:10:03

标签: c# multithreading exception-handling

我有一个功能很多,并且是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
}

0 个答案:

没有答案