【问题标题】:How do i find out if WebClient.DownloadFileTaskAsync was cancelled?如何确定 WebClient.DownloadFileTaskAsync 是否被取消?
【发布时间】:2014-07-31 12:36:30
【问题描述】:

我如何知道对 WebClient.DownloadFileTaskAsync 的调用是否被取消?

我的方法调用是这样的:

WebClient webclient = new WebClient();
await webClient.DownloadFileTaskAsync(uri, filename);

然后调用在别处被取消:

webClient.CancelAsync();

当等待继续时,我如何知道它是成功还是被取消?

【问题讨论】:

  • 不会抛出异常吗?

标签: c# .net asynchronous xamarin.ios webclient


【解决方案1】:

使用await 时,如果您正在等待的对象被取消,则会抛出OperationCanceledException 对象。

如果任务没有取消,在await点之后会正常恢复执行。

【讨论】:

  • +1:没错,很明显!不知何故,我把注意力集中在 Task not await 上。
【解决方案2】:

如果我没记错的话,您可以简单地检查您等待的 Task 对象。

WebClient webclient = new WebClient();
var task = webClient.DownloadFileTaskAsync(uri, filename);
await task;

稍后,您可以检查它:

task.Status
task.IsCancelled
task.IsCompleted  -> task.Result
task.IsFaulted    -> task.Exception

MSDN:Task

...或者只是检查 Jean Hominal 的关于该主题的出色观点(在任务失败时,await 只是抛出而不是继续)。

【讨论】:

  • 谢谢。我对 Task task = await webClient.etc 进行了几乎相同的尝试...但是编译器抱怨它返回 null 而不是 task。
【解决方案3】:

由于DownloadFileTaskAsync 方法返回一个Task,您应该能够简单地查看IsCancelled 属性。

if (task.IsCancelled) {
     // Task was cancelled.
}

查看此链接:

http://msdn.microsoft.com/en-us/library/system.threading.tasks.task(v=vs.110).aspx

IsCancelled - 获取此任务实例是否已完成执行 因为被取消了。

【讨论】:

    猜你喜欢
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多