How to attach CancellationTokenSource to DownloadStringTaskAsync method and cancel the async call?

后端 未结 3 1989
佛祖请我去吃肉
佛祖请我去吃肉 2021-02-05 13:10

I an creating a sample example to call link using WebClient using async and await method now I want to attach cancel async call functionality also. But I am not able to get Can

相关标签:
3条回答
  • 2021-02-05 13:53

    WebClient doesn't support cancellation. I recommend you use a newer type such as HttpClient:

    ...
    cts = new CancellationTokenSource();
    string result;
    using (var client = new HttpClient())
    using (var response = await client.GetAsync("http://gyorgybalassy.wordpress.com", cts.Token))
    {
      result = await response.Content.ReadAsStringAsync();
    }
    
    if (result.Length < 100000)
    ...
    

    The GetAsync method by default will not complete until it reads the entire response, so the await response.Content.ReadAsStringAsync line will actually complete synchronously.

    0 讨论(0)
  • 2021-02-05 13:57

    The async capabilities of WebClient predate .Net 4.5, so it supports the Task-based Asynchronous Pattern only partially. That includes having its own cancellation mechanism: the CancelAsync() method, which works even with the new -TaskAsync methods. To call this method when a CancellationToken is canceled, you can use its Register() method:

    cts.Token.Register(wc.CancelAsync);
    

    As an alternative, you could use the new HttpClient, as Stephen suggested, which fully supports TAP, including CancellationTokens.

    0 讨论(0)
  • 2021-02-05 14:01

    Extension methods based on svick's answer:

    public static async Task<string> DownloadStringTaskAsync(this WebClient webClient, string url, CancellationToken cancellationToken) {
        using (cancellationToken.Register(webClient.CancelAsync)) {
            return await webClient.DownloadStringTaskAsync(url);
        }
    }
    
    public static async Task<string> DownloadStringTaskAsync(this WebClient webClient, Uri uri, CancellationToken cancellationToken) {
        using (cancellationToken.Register(webClient.CancelAsync)) {
            return await webClient.DownloadStringTaskAsync(uri);
        }
    }
    
    0 讨论(0)
提交回复
热议问题