我在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调用都能在下一次调用之前完成,但似乎并非如此。
答案 0 :(得分:0)
这在UI线程或线程池线程上都可以正常工作。我构建了一个完全正确的应用程序,并且没有任何麻烦(测试:x86和x64,调试和发布版本,VS2017 15.5.3)。
co_await之后的指令将在前一个指令完成之前执行,如您所料。
我所知道的唯一可能的复杂因素是 - 或许 - 你的子文件夹列表有些损坏,如果它是一个lambda捕获的变量,可能会发生这种情况。有关详细信息,请参阅this bug report。
另请注意,如果您想以编程方式执行新创建的文件夹,则必须将其作为协程的一部分(附加到上面的代码片段)或co_await在对文件夹采取行动之前,它本身就是协程。