【原创】StackOverflow 20万关注的问题:如何实现异步Task超时的处理?
前文傳送門 dotNET開發(fā)系列
收藏!推薦12個超實用的Visual Studio插件
程序員:這10種糟糕的程序命名,你遇到過幾個?
使用Vistual Studio N年,推薦2個異常捕獲的技巧
面試官:你連RESTful都不知道我怎么敢要你?
程序員:我終于知道post和get的區(qū)別
居然不知道&和&&的區(qū)別?
之前在實際工作中,遇到過這樣的問題,異步獲取 GPS 定位信息。一個實際的問題出現(xiàn)了,在第一次定位的時候一般時間都比較長,現(xiàn)在的要做的是,當(dāng)超出一定的時間,就提醒用戶。
那么如何實現(xiàn)異步等待任務(wù)并在超時時進(jìn)行一定的處理呢?
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 方法所支持的的特點:一個是取消任務(wù),一個是超時。但是不可避免的是阻塞線程,一般在主線程中(UI 線程)是要避免耗時任務(wù)的。如果真要去等待獲取定位信息的 Task,會不可避免地卡住界面,用戶體驗不夠良好。
Task 的靜態(tài)方法
Task.When** 可等待多個異步任務(wù),不阻塞線程,所以可以利用 Delay 靜態(tài)方法“間接”實現(xiàn)異步超時的處理,非阻塞的方式!
var resultTask = Task.WhenAny(task, Task.Delay(timeout))我們再 WhenAny 方法中代入兩個 task 參數(shù):源 task、新建的延遲的 task(ps:即超時的時間 task),再得到 resultTask。
// 摘要:任何提供的任務(wù)已完成時,創(chuàng)建將完成的任務(wù)。 // 參數(shù):tasks:等待完成的任務(wù)。 // 返回結(jié)果:表示提供的任務(wù)之一已完成的任務(wù)。返回任務(wù)的結(jié)果是完成的任務(wù)。 public static Task<Task> WhenAny(params Task[] tasks);異步 Task 實現(xiàn)超時處理的方法
Task.WhenAny(task, Task.Delay(timeout)),再比較這兩個 Task 的執(zhí)行先后。實現(xiàn)代碼如下:
public static async Task<TResult> WaitAsync<TResult>(Task<TResult> task, TimeSpan timeout){if (await Task.WhenAny(task, Task.Delay(timeout)) == task){//指定時間內(nèi)完成的處理return await task;}else{//超時處理throw new TimeoutException("The operation has timed out.");}}思考
上述方法所實現(xiàn)的等待一個獲取 gps 的耗時任務(wù),是沒有任何問題的。并不會產(chǎn)生性能、卡界面等問題,但是如果在源 task(ps:執(zhí)行獲取 gps 的 task),在超時到期之前完成,則不會取消在 Task.Delay 調(diào)用中啟動的內(nèi)部計時器作業(yè)。當(dāng)調(diào)用多次該方法時,“僵尸”計時器作業(yè)的數(shù)量變得越來越大時。性能可能會受到影響
相關(guān)鏈接
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我的公眾號回顧
原創(chuàng)2019年還剩1天,我從外包公司離職了
搶票12306崩了,90%的人都用過這三款搶票工具
作死博客園刷粉絲啟示錄
工具程序員必裝的10款谷歌插件
技巧99%的人不知道搜索引擎的6個技巧
總結(jié)
以上是生活随笔為你收集整理的【原创】StackOverflow 20万关注的问题:如何实现异步Task超时的处理?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET Core 中间件的几种实
- 下一篇: XRPC接口双向调用