【问题标题】:CopyAsync never runs to completionCopyAsync 永远不会运行完成
【发布时间】:2021-06-15 18:06:08
【问题描述】:

我正在将文件从 USB 记忆棒复制到我的应用程序中的 LocalState 文件夹。因为它是我正在使用的 UWP

Windows::Storage::StorageFolder^ removeableDevices = Windows::Storage::KnownFolders::RemovableDevices;

获取U盘路径等

auto copyTask = create_task(virtualFile->CopyAsync(targetFolder, outputFilenameUwp, Windows::Storage::NameCollisionOption::GenerateUniqueName));
while (!copyTask.is_done())
{
    Sleep(100);
}

上述方法运行到文件完全复制到 LocalState 但任务从未完成。它只是永远留在while循环中。我可以执行工作以检查文件是否已达到正确的大小,然后跳出循环,但这是次优的。

我是不是做错了什么?

提前致谢!

【问题讨论】:

    标签: uwp c++-cx


    【解决方案1】:

    您可以尝试在 copyTask 上使用 task::then 并提供将在异步操作完成时调用的 lambda。

    请参考以下代码:

    auto copyTask =
        create_task(file->CopyAsync(folder, "test.jpg", NameCollisionOption::GenerateUniqueName));
    copyTask.then([](StorageFile^ copiedFile) { //This lambda will be invoked when the copyTask completes
        String^ name = copiedFile->Name;
        });
    

    copyTask.then 中 lambda 的输入参数是任务完成时copyTask 操作产生的结果。更多关于通过任务消费异步操作的信息,可以参考document

    【讨论】:

    • 这也不起作用。似乎存在任务状态没有改变的问题......状态检查适用于其他示例,但具体不适用于此示例。
    • 能否告诉我您要复制的文件大小,以及是否在应用清单文件中注册了要复制的文件类型,参考document?您可以尝试在文件资源管理器中将文件复制到另一个磁盘(例如 D 盘)中,然后使用您的应用程序将文件复制到 D 盘中,以便检查问题是否与 U 盘有关。
    • 文件大小约为 10GB,我还有一个 NVMe SSD,是否与它有关。我刚刚尝试在本地文件夹之间传输:LocalState -> LocalState 并且发生了同样的问题......很奇怪,正如我所说的它适用于其他类型的任务,但复制似乎有问题。感谢您的帮助!
    • 好的,有更新了。该任务确实运行到完成,但需要一段时间。文件复制后的 10-15 秒状态更改。很抱歉造成混乱,但这仍然不是此类事情的预期行为?
    • 如果您复制的文件大小约为 10 GB,则需要一段时间。花费的时间长度取决于您机器的性能。你说文件复制后需要10-15秒,如果这个时间用于10GB的文件,是合理的。
    【解决方案2】:

    事实证明我太不耐烦了,一旦文件被复制,就需要进行一些内务处理。一旦完成,就会设置正确的状态。

    【讨论】:

      猜你喜欢
      • 2020-12-05
      • 1970-01-01
      • 2017-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多