using System; using System.Net.Http; using System.Threading; using System.Threading.Channels; using System.Threading.Tasks; namespace ConsoleApp1 { class Program { static async Task Main(string[] args) { await GetWeatherToday(); await GetWeatherTest(); Console.ReadKey(); } public async static Task GetWeatherToday() { /* 在某些場景中,我們需要請求外部的第三方資源,比如請求天氣預報信息;但是,由於網絡等原因,可能會造成長時間的等待以致業務超時退出, 這種情況可以使用 CancellationToken 來進行優化,但請求超過指定時長后退出,而不必針對每個 HttpClient 進行單獨的超時設置 CancellationToken(取消令牌) */ CancellationTokenSource cts = new CancellationTokenSource(); cts.CancelAfter(3000); //3秒后取消 HttpClient client = new HttpClient(); var res = await client.GetAsync("http://www.weather.com.cn/data/sk/101020100.html", cts.Token); var result = await res.Content.ReadAsStringAsync(); Console.WriteLine(result); cts.Dispose(); client.Dispose(); } /// <summary> /// CancellationToken 的鏈式反應 /// 可以使用創建一組令牌,通過鏈接各個令牌,使其建立通知關聯,當 CancellationToken 鏈中的某個令牌收到取消通知的時候, /// 由鏈式中創建出來的 CancellationToken 令牌也將同時取消 /// 代碼定義了 3 個 CancellationTokenSource ,分別是 cts1,cts2,cts3,每個 CancellationTokenSource 分別注冊了 Register 取消回調委托, /// 然后,使用 HttpClient 發起 3 組網絡請求;其中,設置 cts2 在請求開始 1秒 后退出, /// 預期結果為:當 cts2 退出后,由於 cts3 是使用 CreateLinkedTokenSource(cts1.Token, cts2.Token) 創建出來的,所以 cts3 應該也會被取消, /// 實際上,無論 cts1/cts2 哪個令牌取消,cts3 都會被取消 /// </summary> /// <returns></returns> public async static Task GetWeatherTest() { CancellationTokenSource cts1 = new CancellationTokenSource(); CancellationTokenSource cts2 = new CancellationTokenSource(); var cts3 = CancellationTokenSource.CreateLinkedTokenSource(cts1.Token, cts2.Token); //注冊Register取消回調委托 cts1.Token.Register(() => { Console.WriteLine("cts1 Canceling"); }); cts2.Token.Register(() => { Console.WriteLine("cts2 Canceling"); }); cts2.CancelAfter(1000); //1秒后取消 cts3.Token.Register(() => { Console.WriteLine("cts3 Canceling"); }); var res = await new HttpClient().GetAsync("http://www.weather.com.cn/data/sk/101020100.html", cts1.Token); var result = await res.Content.ReadAsStringAsync(); Console.WriteLine("cts1:{0}", result); var res2 = await new HttpClient().GetAsync("http://www.weather.com.cn/data/sk/101020100.html", cts2.Token); var result2 = await res2.Content.ReadAsStringAsync(); Console.WriteLine("cts2:{0}", result2); var res3 = await new HttpClient().GetAsync("http://www.weather.com.cn/data/sk/101020100.html", cts3.Token); var result3 = await res2.Content.ReadAsStringAsync(); Console.WriteLine("cts3:{0}", result3); } } }
MSCL超級工具類庫
基於C#開發的超強工具類,包含數據庫操作,字符串處理,文件或者文件夾處理
網絡請求,緩存處理,數據容器等上百個常用工具類封裝,附帶調用示例和參數說明,
提供CHM詳細文檔,上百個生產環境使用,穩定高效,簡單易用。
真正做到“工具在手,一切盡有”,讓你大幅度的提高編程效率,提高編程水平。
聯系QQ:7400799(請備注 "MSCL")
===============================================
重要壓縮文件忘記解壓密碼?網上下載rar/zip/7z等壓縮文件,需要密碼?
====極速解密助手,支持支持RAR/ZIP/7Z等多種壓縮文檔解密======
★ 解密不超過24小時,跟密碼復雜程度相關
★ 解密成功后再收費,無套路
★ 解密成功后自動刪除原件,無后顧之憂
聯系QQ:7400799(請備注 "文件解密")
==============================================
Magic.Orm已在數百個成熟項目中應用,是比較完善的ORM框架(基於C#開發)。開發過程中參考了NBear與MySoft,吸取了其中的一些精華,加入新思想,
后期參考EF的Lambda語法進行大量擴展。
為什么選擇Magic.Orm?
- 上手簡單,0學習成本。使用方便,按照sql書寫習慣編寫C#.NET代碼。功能強大。
- 高性能,接近手寫Sql。
- 體積小(不到200kb,僅一個dll)。
- 完美支持Sql Server(2000至最新版),MySql,Oracle,Access,Sqlite等數據庫。
- 支持大量Lambda表達式寫法。
- 不需要像NHibernate的XML配置,不需要像EF的各種數據庫連接驅動,集成簡單。
購買源碼 請聯系QQ:7400799(請備注 "ORM")