Параллельное время выполнения обнаруживает, что исключения, вызванные задачами, не могут быть обработаны и «быстро завершается неудачей»; то есть он завершает процесс. У меня есть случай, когда несколько подзадач дано 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
немедленно вызвать его продолжение, не дожидаясь завершения / отмены других подзадач, а затем исключение, вызванное другими подзадачами, не может быть обработано и приводит к завершению процесса. Это кажется крайне нежелательным. Есть ли обходной путь? Это ошибка? Я что-то пропустил?
Задача ещё не решена.
Других решений пока нет …