C# 多線程中CancellationToken(取消令牌)以及鏈式反應


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")


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM