前言:本人最近較多使用.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多線程
其實針對異步請求處理的方案,個人博客裏原來的一篇轉發文章也提到了該方案,只不過本身忘記看了,真是一有問題就找百度,忘了本身還有一套百寶箱呢!!哈哈.... 異步
這個是C#5中的新特性,當遇到await時,會從線程池中取出一個線程異步執行await等待的操做,而後方法當即返回。等異步操做結束後回到await所在的地方接着日後執行。await須要等待async Task<T>類型的函數。詳細的使用方法可參考相關資料,測試代碼以下所示。異步結束後的會返回到調用線程,因此修改UI不須要Dispatcher。async
也能夠把TestTask包裝成async方法,這樣就能夠使用上圖中註釋掉的兩行代碼進行處理。包裝後的異步方法以下所示:函數
async/await也是從線程池中取線程,可實現線程複用,並且代碼簡潔容易閱讀,異步操做返回後會自動返回調用線程,是執行異步操做的首選方式。並且雖然是C#5的新特性,但C#4能夠經過下載升級包來支持async/await。post