2

并发运行时检测任务抛出的异常何时无法处理并“快速失败”;也就是说,它终止了进程。我有一个案例,给 a 的多个子任务when_all可能会引发异常。理想情况下,我希望这些异常取消任务树,然后聚合到一个在顶级获取或等待中引发的异常中。相反,我的进程会从我下面终止。这是一个演示问题的玩具示例:

#include <tchar.h>
#include <ppltasks.h>
#include <iostream>
#include <vector>

concurrency::task<int> CreateTask(int i)
{
    return concurrency::create_task([i]()
    {
        throw std::runtime_error("boo");
        return i;
    });
}

void Go()
{
    std::vector<concurrency::task<int>> tasks;

    tasks.push_back(CreateTask(1));
    tasks.push_back(CreateTask(2));

    auto allDone = concurrency::when_all(tasks.begin(), tasks.end());
    try
    {
        allDone.get();
    }
    catch (std::exception& e)
    {
        std::cout << "Exception: " << e.what() << std::endl;
    }
    catch (...)
    {
        std::cout << "Unexpected exception." << std::endl;
    }

}

int _tmain(int argc, _TCHAR* argv[])
{
    Go();
    std::cout << "Process is still running." << std::endl;
    return 0;
}

在此示例中,进程在“进程仍在运行”打印到控制台之前终止。似乎子任务中的异常导致wait_all立即调用其继续,而不等待其他子任务完成/取消,然后无法处理其他子任务引发的异常并导致进程终止。这似乎是非常不可取的。有解决方法吗?这是一个错误吗?我错过了什么吗?

4

0 回答 0