【问题标题】:C++/cx coroutines : basic loop exampleC++/cx 协程:基本循环示例
【发布时间】: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)

标签: uwp coroutine c++-cx


【解决方案1】:

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

co_await 之后的指令在前一条指令完成之前不会执行,如您所料。

我知道的唯一可能的复杂情况是 - 也许 - 您的子文件夹列表出现了一些损坏,如果它是一个 lambda 捕获的变量,可能会发生这种情况。详情请见this bug report

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

【讨论】:

    猜你喜欢
    • 2020-03-19
    • 1970-01-01
    • 2018-10-17
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    • 2018-10-07
    • 1970-01-01
    相关资源
    最近更新 更多