Ошибка 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,

Другие вопросы по тегам