为了账号安全,请及时绑定邮箱和手机立即绑定

在“await DownloadTaskAsync”上调用 WebClient.Cancel

在“await DownloadTaskAsync”上调用 WebClient.Cancel

C#
PIPIONE 2022-12-31 13:42:49
这很好用:private WebClient _webClient;private void ButtonStart_Click(object sender, RoutedEventArgs e) {    using (_webClient = new WebClient()) {        _webClient.DownloadFileTaskAsync("https://speed.hetzner.de/100MB.bin", @"D:\100MB.bin");    }}private void ButtonStop_Click(object sender, RoutedEventArgs e) {    _webClient.CancelAsync();}虽然此代码(注意异步/等待模式)...:private WebClient _webClient;private async void ButtonStart_Click(object sender, RoutedEventArgs e) {    using (_webClient = new WebClient()) {        await _webClient.DownloadFileTaskAsync("https://speed.hetzner.de/100MB.bin", @"D:\100MB.bin");    }}private void ButtonStop_Click(object sender, RoutedEventArgs e) {    _webClient.CancelAsync();}...抛出以下异常:系统.Net.WebException请求被中止:请求被取消。   at System.Net.ConnectStream.EndRead(IAsyncResult asyncResult)   at System.Net.WebClient.DownloadBitsReadCallbackState(DownloadBitsState state, IAsyncResult result)--- End of stack trace from previous location where exception was thrown ---   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()   at WpfApp1.MainWindow.<ButtonStart_Click>d__2.MoveNext() in WpfApp1\MainWindow.xaml.cs:line 19如何在await WebClient.DownloadFileTaskAsync()不引发异常的情况下取消开始的任务?
查看完整描述

2 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

例外正是它应该如何工作。

如果您不希望该异常传播出您的事件处理程序,则捕获该异常。



查看完整回答
反对 回复 2022-12-31
?
撒科打诨

TA贡献1934条经验 获得超2个赞

您可以像这样捕获异常:


using (_webClient = new WebClient())

{

    try

    {

        await _webClient.DownloadFileTaskAsync("https://speed.hetzner.de/100MB.bin", @"D:\100MB.bin");

    }

    catch (WebException ex) when (ex.Status == WebExceptionStatus.RequestCanceled)

    {

        Console.WriteLine("Cancelled");

    }

}

更新:如何更改 的默认行为CancelAsync,以避免必须捕获异常:


public static Task<bool> OnCancelReturnTrue(this Task task)

{

    return task.ContinueWith(t =>

    {

        if (t.IsFaulted)

        {

            if (t.Exception.InnerException is WebException webEx

                && webEx.Status == WebExceptionStatus.RequestCanceled) return true;

            throw t.Exception;

        }

        return t.IsCanceled;

    }, TaskContinuationOptions.ExecuteSynchronously);

}

使用示例:


bool cancelled = await _webClient.DownloadFileTaskAsync(

    "https://speed.hetzner.de/100MB.bin", @"D:\100MB.bin").OnCancelReturnTrue();

if (cancelled) Console.WriteLine("Cancelled");


查看完整回答
反对 回复 2022-12-31
  • 2 回答
  • 0 关注
  • 122 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信