【发布时间】:2017-07-18 22:19:38
【问题描述】:
我在 UWP 应用程序中遇到了一个简单的 couroutine 示例,但不知道如何实现它。
这是我的目的:给定磁盘上的路径和基本文件夹,我想创建相关的文件夹层次结构。 例如: 基本文件夹:“c:\test\” 路径:“test1\test2\test3”
我的目的是创建文件夹 test1、test2 和 test3,所以我们有以下文件夹结构: c:\test\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 调用在进行下一个调用之前完成,但似乎并非如此。
【问题讨论】:
-
您的意思是
CreateFolderAsync(subfolder);而不是subfolder_mng? -
是的,你是对的,我编辑了问题。
-
另外,您应该在其中创建新项目之前检查返回项目的类型(目录、文件、..)。可能有人有文件 c:\test\test1\test2" 而不是文件夹。
-
我将您的功能复制到独立的测试应用程序中。每次我运行它时它都会起作用(即使路径的一部分已经存在,例如“c:\temp\test1\test2”)。我测试了两个变种
create_folders_if_required()&create_folders_if_required().get(),没有任何问题。但它仅在存在同名文件时才会静默(没有任何例外)失败(例如:“c:\temp\test1\test2”是文件而不是文件夹)。可能你应该在主要步骤之间插入一些调试跟踪,或者其他可以说明它在哪里停止工作的东西。如果您找到解决方案,请描述它。 -
我认为我的问题来自这样一个事实,即我所做的调用是从不支持这些功能的 UI 线程进行的。我不确定,因为没有任何错误消息。但是,来自 ppltasks 的函数 wait() 假设做同样的事情在主线程上不起作用,并且如果我在我的代码中使用它会引发一个断言 (msdn.microsoft.com/en-us/library/hh749955(v=vs.120).aspx)