Ошибка WinRT 0x40080201
Я писал код и получал ошибку при выполнении тяжелого параллелизма над IVectorView<StorageFile^>^>
, Вывод отладки был:
Исключение первого шанса в 0x76e86118 в tool.exe: 0x40080201: ошибка источника WinRT.
Исключение первого шанса в 0x76e86118 в tool.exe: исключение Microsoft C++: Platform::FailureException ^ в ячейке памяти 0x02daec60.
Код выглядит примерно так:
task<vector<long long>> GetDatesTakenFromFiles(IVectorView<StorageFile^>^ filesInFolder)
{
vector<task<long long>> datesTakenTasks;
for each (auto file in filesInFolder)
{
datesTakenTasks.push_back(
create_task(file->Properties->GetImagePropertiesAsync())
.then([=](FileProperties::ImageProperties^ properties) {
return properties->DateTaken.UniversalTime;
})
);
}
return when_all(begin(datesTakenTasks), end(datesTakenTasks));
}
1 ответ
После некоторого расследования я обнаружил, что ссылка на file
объект изнутри внутренней лямбды заставил бы его работать:
task<vector<long long>> GetDatesTakenFromFiles(IVectorView<StorageFile^>^ filesInFolder)
{
vector<task<long long>> datesTakenTasks;
for each (auto file in filesInFolder)
{
datesTakenTasks.push_back(
create_task(file->Properties->GetImagePropertiesAsync())
.then([=](FileProperties::ImageProperties^ properties) {
// I don't know why, but the file was being cleaned up. This prevents it.
UNREFERENCED_PARAMETER(file);
return properties->DateTaken.UniversalTime;
})
);
}
return when_all(begin(datesTakenTasks), end(datesTakenTasks));
}
В качестве примечания хочу отметить, что эта ошибка возникала только при использовании итерации. FolderDepth::Shallow
, но нет FolderDepth::Deep
,