【原创】StackOverflow 20万关注的问题:如何实现异步Task超时的处理?
前文傳送門 dotNET開發系列
收藏!推薦12個超實用的Visual Studio插件
程序員:這10種糟糕的程序命名,你遇到過幾個?
使用Vistual Studio N年,推薦2個異常捕獲的技巧
面試官:你連RESTful都不知道我怎么敢要你?
程序員:我終于知道post和get的區別
居然不知道&和&&的區別?
之前在實際工作中,遇到過這樣的問題,異步獲取 GPS 定位信息。一個實際的問題出現了,在第一次定位的時候一般時間都比較長,現在的要做的是,當超出一定的時間,就提醒用戶。
那么如何實現異步等待任務并在超時時進行一定的處理呢?
Task 的實例方法 Wait
public bool Wait(int millisecondsTimeout, CancellationToken cancellationToken); public bool Wait(int millisecondsTimeout); public bool Wait(TimeSpan timeout); public void Wait(); public void Wait(CancellationToken cancellationToken);Wait 方法所支持的的特點:一個是取消任務,一個是超時。但是不可避免的是阻塞線程,一般在主線程中(UI 線程)是要避免耗時任務的。如果真要去等待獲取定位信息的 Task,會不可避免地卡住界面,用戶體驗不夠良好。
Task 的靜態方法
Task.When** 可等待多個異步任務,不阻塞線程,所以可以利用 Delay 靜態方法“間接”實現異步超時的處理,非阻塞的方式!
var resultTask = Task.WhenAny(task, Task.Delay(timeout))我們再 WhenAny 方法中代入兩個 task 參數:源 task、新建的延遲的 task(ps:即超時的時間 task),再得到 resultTask。
// 摘要:任何提供的任務已完成時,創建將完成的任務。 // 參數:tasks:等待完成的任務。 // 返回結果:表示提供的任務之一已完成的任務。返回任務的結果是完成的任務。 public static Task<Task> WhenAny(params Task[] tasks);異步 Task 實現超時處理的方法
Task.WhenAny(task, Task.Delay(timeout)),再比較這兩個 Task 的執行先后。實現代碼如下:
public static async Task<TResult> WaitAsync<TResult>(Task<TResult> task, TimeSpan timeout){if (await Task.WhenAny(task, Task.Delay(timeout)) == task){//指定時間內完成的處理return await task;}else{//超時處理throw new TimeoutException("The operation has timed out.");}}思考
上述方法所實現的等待一個獲取 gps 的耗時任務,是沒有任何問題的。并不會產生性能、卡界面等問題,但是如果在源 task(ps:執行獲取 gps 的 task),在超時到期之前完成,則不會取消在 Task.Delay 調用中啟動的內部計時器作業。當調用多次該方法時,“僵尸”計時器作業的數量變得越來越大時。性能可能會受到影響
相關鏈接
https://devblogs.microsoft.com/pfxteam/crafting-a-task-timeoutafter-method/
https://stackoverflow.com/questions/4238345/asynchronously-wait-for-taskt-to-complete-with-timeout
參考資料
[1]
Task.ContinueWith: http://msdn.microsoft.com/en-us/library/dd270696.aspx
[2]Task.Wait: http://msdn.microsoft.com/en-us/library/dd235606.aspx
推薦閱讀
面試分享昨天面試5道有意思的題目
匯總2019我的公眾號回顧
原創2019年還剩1天,我從外包公司離職了
搶票12306崩了,90%的人都用過這三款搶票工具
作死博客園刷粉絲啟示錄
工具程序員必裝的10款谷歌插件
技巧99%的人不知道搜索引擎的6個技巧
總結
以上是生活随笔為你收集整理的【原创】StackOverflow 20万关注的问题:如何实现异步Task超时的处理?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET Core 中间件的几种实
- 下一篇: C# WPF 表单更改提示