這個是C#5中的新特性,當遇到await時,會從線程池中取出一個線程非同步執行await等待的操作,然後方法立即返回。等非同步操作結束後回到await所在的地方接著往後執行。await需要等待async Task ...
前言:本人最近較多使用.net core的項目,最近在使用httpClient發送請求的時候,遇到伺服器處理時間較長時,就老是會報異常:TaskCanceledException: A task was canceled。 我的使用非同步請求的方法也較為老套,使用的Task a=()=>{}; a.Wait(); 來等待非同步操作的結束,這種方式執行等待時,就常會出現上面的異常信息,在.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"); });
但是程式在運行中,時不時給你來個異常,也讓人受不了! 後來也嘗試過使用異常捕獲,然後再次請求的方案,這種方案治標不治本,有時候標也治不了,就一直給你拋取消異常,你就一直捕獲不斷重試去吧,程式會卡在那裡!!
後來就各種百度啊,終於在一篇文章中找到瞭解決方案,使用 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。
也可以把TestTask包裝成async方法,這樣就可以使用上圖中註釋掉的兩行代碼進行處理。包裝後的非同步方法如下所示:
async/await也是從線程池中取線程,可實現線程復用,而且代碼簡潔容易閱讀,非同步操作返回後會自動返回調用線程,是執行非同步操作的首選方式。而且雖然是C#5的新特性,但C#4可以通過下載升級包來支持async/await。