C ++ / cx协同程序:基本循环示例

时间:2017-07-18 22:19:39

标签: uwp coroutine c++-cx

我在UWP应用程序中遇到了一个简单的couroutine示例,但无法找到如何实现它。

这是我的目的:给定磁盘和基本文件夹上的路径,我想创建关联的文件夹层次结构。 例如: 基本文件夹:“c:\ test \” 路径:“test1 \ test2 \ test3”

我的目的是创建文件夹test1,test2和test3,所以我们有以下文件夹结构: C:\测试\ TEST1 \ TEST2 \ TEST3 \

这是我到目前为止所做的事情: 我解析路径,所以我在一个数组中有不同的组件(test1,test2和test3)(以下示例中的子文件夹)

        Windows::Storage::StorageFolder^ current_storage_folder = base_folder;
        for (auto& subfolder : subfolders)
        {
            if (!subfolder.empty())
            {
                Windows::Storage::StorageFolder^ next_storage_folder = (Windows::Storage::StorageFolder^)co_await current_storage_folder->TryGetItemAsync(subfolder);
                if (next_storage_folder == nullptr)
                {
                    next_storage_folder = co_await current_storage_folder->CreateFolderAsync(subfolder);
                }
                current_storage_folder = next_storage_folder;
            }

        }

我得到的输出是错误的,因为我创建了test1,有时是test2。 但结果无法预测。

我认为我对co_await的理解是错误的,因为我希望每次co_await调用都能在下一次调用之前完成,但似乎并非如此。

1 个答案:

答案 0 :(得分:0)

这在UI线程或线程池线程上都可以正常工作。我构建了一个完全正确的应用程序,并且没有任何麻烦(测试:x86和x64,调试和发布版本,VS2017 15.5.3)。

co_await之后的指令将在前一个指令完成之前执行,如您所料。

我所知道的唯一可能的复杂因素是 - 或许 - 你的子文件夹列表有些损坏,如果它是一个lambda捕获的变量,可能会发生这种情况。有关详细信息,请参阅this bug report

另请注意,如果您想以编程方式执行新创建的文件夹,则必须将其作为协程的一部分(附加到上面的代码片段)或co_await在对文件夹采取行动之前,它本身就是协程。