.Net core webapi使用httpClient發送異步請求遇到TaskCanceledException: A task was canceled

  前言:本人最近較多使用.net core的項目,最近在使用httpClient發送請求的時候,遇到服務器處理時間較長時,就總是會報異常:TaskCanceledException: A task was canceled。   個人使用異步請求的方法也較爲老套,使用的Task a=()=>{};   a.Wait();  來等待異步操做的結束,這種方式執行等待時,就常會出現上面的異常信息,在.net Core中httpClient添加配置超時時長也沒用:html

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");
            });

  可是程序在運行中,時不時給你來個異常,也讓人受不了! 後來也嘗試過使用異常捕獲,而後再次請求的方案,這種方案治標不治本,有時候標也治不了,就一直給你拋取消異常,你就一直捕獲不斷重試去吧,程序會卡在那裏!!服務器

 

  後來就各類百度啊,終於在一篇文章中找到了解決方案,使用 async+await的方案替代task.Wait()是個好的解決方案,至於爲何?  本人真心不知道,只瞭解到task.Wait()是一種比較老的寫法,而async+await是目前主流的異步處理方案,可能優化了各類問題吧,反正好用哈。。。  這是在百度裏找到的文章:https://cloud.tencent.com/developer/ask/176717多線程

 

 

其實針對異步請求處理的方案,個人博客裏原來的一篇轉發文章也提到了該方案,只不過本身忘記看了,真是一有問題就找百度,忘了本身還有一套百寶箱呢!!哈哈....     異步

使用Task異步執行方法_多線程_應用程序池

 

劃重點:0x05 使用async/await進行異步操做

這個是C#5中的新特性,當遇到await時,會從線程池中取出一個線程異步執行await等待的操做,而後方法當即返回。等異步操做結束後回到await所在的地方接着日後執行。await須要等待async Task<T>類型的函數。詳細的使用方法可參考相關資料,測試代碼以下所示。異步結束後的會返回到調用線程,因此修改UI不須要Dispatcher。async

 

也能夠把TestTask包裝成async方法,這樣就能夠使用上圖中註釋掉的兩行代碼進行處理。包裝後的異步方法以下所示:函數

 

async/await也是從線程池中取線程,可實現線程複用,並且代碼簡潔容易閱讀,異步操做返回後會自動返回調用線程,是執行異步操做的首選方式。並且雖然是C#5的新特性,但C#4能夠經過下載升級包來支持async/await。post

相關文章
相關標籤/搜索