日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【原创】StackOverflow 20万关注的问题:如何实现异步Task超时的处理?

發布時間:2023/12/4 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【原创】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超时的处理?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。