WepApi TaskCanceledException A任务已取消--async+await的方案替代task.Wait()可有效解决高并发问题

发布时间 2023-12-21 13:42:31作者: hofmann

 

在.net Core中httpClient添加配置超时时长也没用

services.AddHttpClient("PPHttpClient", config =>
            {
                config.DefaultRequestHeaders.Add("Accept", "*/*");
                config.DefaultRequestHeaders.Add("AcceptLanguage", "en-US");
                config.Timeout = TimeSpan.FromMinutes(5);
                config.DefaultRequestHeaders.Add("Accept-Encoding", "gzip, deflate");
            });

 

task.Wait()是一种比较老的写法,而async+await是目前主流的异步处理方案

不要使用Task a=()=>; a.Wait(); 会导致堵塞。
使用这样await a;

 

参考:WepApi TaskCanceledException A任务已取消。httpClient-腾讯云开发者社区-腾讯云 (tencent.com)

account = result.Content.ReadAsAsync<cuentaM>().Result;

替换为

account = await result.Content.ReadAsAsync<cuentaM>();

 

Task.Delay中传CancellationToken就是会抛异常,要想不抛异常用Task.WhenAny和TaskCompletionSource的组合即可。

static TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();

    string GetB()
    {
        tcs.SetCanceled();
        return "";
    }

    async Task<string> GetString()
    {
        await Task.WhenAny(Task.Delay(3000), tcs.Task);
        return "";
    }