2017-07-18 80 views
0

我遇到了UWP應用程序中couroutine的一個簡單示例,但無法找到如何實現它。C++/cx協程:基本循環示例

這是我的目的:給定一個磁盤和一個基礎文件夾的路徑,我想創建相關的文件夾層次結構。 例如: 基本文件夾: 「C:\測試\」 路徑: 「測試1 \ TEST2 \ TEST3」

我的目的是創建的文件夾爲test1,test2的和TEST3所以,我們有以下文件夾結構: Ç :\ 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; 
      } 

     } 

我得到的輸出是錯誤的,因爲我有測試1是創建的,有時候是test2。但是,結果不能被預測。

我認爲我對co_await的理解是錯誤的,因爲我期待每個co_await調用在完成下一個調用之前完成,但似乎並非如此。

+0

你是不是指'CreateFolderAsync(subfolder);'而不是'subfolder_mng'? –

+0

是的,你是對的,我編輯了這個問題。 –

+0

另外,您應該在創建新內容之前檢查返回的項目(目錄,文件,..)的類型。可能有人有文件c:\ test \ test1 \ test2「不是文件夾 –

回答

0

這適用於UI線程或線程池線程。我構建了一個應用程序,完全沒有任何問題(測試:x86和x64,調試和發佈版本,VS2017 15.5.3)。

co_await之後的指令將不會執行,直到前一個完成爲止。

我知道的唯一可能的複雜情況是 - 也許 - 你的子文件夾列表有些損壞,如果它是一個lambda捕獲變量,可能會發生。有關詳細信息,請參見this bug report

還要注意的是,如果你想以編程一些與新創建的文件夾,你就必須要麼使之成爲協同程序的一部分(追加到上面的代碼片段)或co_await的協同程序本身在行動之前在文件夾上。