【问题标题】:Is there a way to cancel StorageFile.CopyAsync()?有没有办法取消 StorageFile.CopyAsync()?
【发布时间】:2012-08-22 16:10:33
【问题描述】:

在 Win8 中,我使用 somefile.CopyAsync(destFolder, newName) 来复制文件。但是当我尝试取消它时,它似乎不起作用。 这两种方法是我尝试取消它的方法:

  1. 只需使用 IAsyncOperation.Cancel

    var op = somefile.CopyAsync(destFoder, newName);
    op.Cancel();
    op.Complete = (x,y) =>
    {
        switch(y) {
            case AsyncStatus.Complete:
                Debug.WriteLine("Completed" + x.GetResults().Name);
                break;
            case AsyncStatus.Cancel:
                Debug.WriteLine("Canceled")
                break;
        }
    }
    
  2. 使用 AsTask(CancellationToken)

    var cts = new CancellationTokenSource();
    cts.CancelAfter(TimeSpan.FromSeconds(1));
    var op = somefile.CopyAsync(destFolder, newName).AsTask(cts.Token);
    await op;
    

在第一种方法中,没有调用case AsyncStatus.Cancel,在第二种方法中,也没有任何反应。我可以尝试其他方法吗?谢谢!

【问题讨论】:

    标签: c# windows-runtime async-await


    【解决方案1】:

    你试过了吗……

    var task = file.CopyAsync(KnownFolders.DocumentsLibrary, "test").AsTask();
    task.AsAsyncAction().Cancel();
    

    它在我的简单测试中有效。

    如果您想使用取消令牌,此代码也应该可以工作

    var source = new CancellationTokenSource(TimeSpan.FromMilliseconds(500));
    var token = source.Token;
    token.Register(() => { Debug.WriteLine("Your cancellation code here"); });
    var task = file.CopyAsync(KnownFolders.DocumentsLibrary, "test").AsTask(token);
    

    【讨论】:

    • 感谢回复,但是使用cancellationtoken的第二种方法不起作用,我将task.AsAsyncAction().Cancel()放在token.register区域,但是复制操作仍然完成,好奇怪。
    • 第一种方法也不起作用,如果我在按钮处添加await task。
    猜你喜欢
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 2012-11-20
    • 2014-10-07
    • 2019-10-04
    • 2019-10-18
    相关资源
    最近更新 更多