【SuperSocket 】利用 TaskCompletionSource 在 SuperSocket 中實現跨模塊異步處理客戶端消息

利用 TaskCompletionSource 在 SuperSocket 中實現跨模塊異步處理客戶端消息

在使用 SuperSocket 構建 TCP 服務時,我們經常會遇到這樣的需求:

  • 服務端接收到客戶端數據后,需要將數據交給其他模塊處理
  • 處理完成后再將結果返回給調用模塊或客戶端
  • 希望調用模塊能夠異步等待處理結果,而不是阻塞線程

本文將通過 TaskCompletionSource 來實現這一場景,并結合 SuperSocket 的異步回調機制,講解完整實現方法。


1?? TaskCompletionSource 基礎語法

TaskCompletionSource<T>(簡稱 TCS)是 .NET 中用于手動控制 Task 完成時機的工具。

1.1 基本概念

  • Task:異步操作的表示,通常由方法內部執行完成
  • TaskCompletionSource:你可以手動控制 Task 何時完成,以及完成結果是什么
var tcs = new TaskCompletionSource<int>();
Task<int> task = tcs.Task;// 模擬異步事件
Task.Run(async () =>
{await Task.Delay(1000);   // 模擬耗時操作tcs.SetResult(42);        // 手動完成 Task 并返回結果
});int result = await task;
Console.WriteLine(result);    // 輸出 42

核心思想:TaskCompletionSource 就像一個“空盒子”,你自己決定什么時候放入結果并“打開盒子”。


1.2 TCS 常用方法

方法功能
SetResult(T result)設置 Task 成功完成并返回結果
TrySetResult(T result)安全寫法,如果 Task 已完成不會拋異常
SetException(Exception ex)設置 Task 異常完成
SetCanceled()取消 Task

2?? 在 SuperSocket 中使用 TCS

SuperSocket 的核心是事件驅動,客戶端數據到達時會觸發 UsePackageHandler 回調。我們可以利用 TCS,將“事件”轉換為“可 await 的 Task”,實現異步等待消息。


2.1 定義等待方法

在服務端或調用模塊中定義:

private TaskCompletionSource<int> _tcs;public Task<int> WaitForNextPackageAsync()
{_tcs = new TaskCompletionSource<int>();return _tcs.Task; // 返回可 await 的 Task
}
  • 外部模塊調用 await WaitForNextPackageAsync() 時,會掛起等待
  • 直到 _tcs.SetResult(result) 被觸發

2.2 接收客戶端消息并觸發 TCS

public event Func<StringPackageInfo, Task<int>> OnPackageReceived;private async ValueTask HandlePackageAsync(IAppSession session, StringPackageInfo package)
{int result = 0;// 調用外部模塊處理消息if (OnPackageReceived != null){result = await OnPackageReceived.Invoke(package);}// 完成 TaskCompletionSource,將結果返回給等待方_tcs?.TrySetResult(result);// 同時可以給客戶端發送響應await session.SendAsync(Encoding.UTF8.GetBytes(result.ToString() + "\r\n"));
}

這里實現了 消息接收與處理邏輯解耦

  • SuperSocket 只負責接收消息
  • 外部模塊處理業務邏輯
  • 調用模塊異步等待處理結果

2.3 外部模塊處理邏輯示例

mainWindow.OnPackageReceived += async (package) =>
{int result = 0;switch (package.Key.ToUpper()){case "ADD":result = package.Parameters.Select(int.Parse).Sum();break;case "SUB":result = package.Parameters.Select(int.Parse).Aggregate((x, y) => x - y);break;case "MULT":result = package.Parameters.Select(int.Parse).Aggregate((x, y) => x * y);break;}return result; // 返回給 TaskCompletionSource
};

2.4 調用模塊等待結果

int result = await mainWindow.WaitForNextPackageAsync();
Console.WriteLine($"處理結果: {result}");
  • 外部模塊就像同步等待一樣獲得了處理結果
  • 實際上整個流程是 異步、非阻塞

3?? 支持多客戶端或多條命令

如果有多個客戶端或希望同時處理多條消息,可以使用 隊列管理 TCS

private ConcurrentQueue<TaskCompletionSource<int>> _queue = new();public Task<int> WaitNextAsync()
{var tcs = new TaskCompletionSource<int>();_queue.Enqueue(tcs);return tcs.Task;
}private async ValueTask HandlePackageAsync(IAppSession session, StringPackageInfo package)
{int result = CalculateResult(package);if (_queue.TryDequeue(out var tcs))tcs.TrySetResult(result);await session.SendAsync(Encoding.UTF8.GetBytes(result.ToString() + "\r\n"));
}
  • 每條消息對應一個 TCS
  • 保證多客戶端/多命令都能異步等待結果

4?? 總結

把回調變成了異步等待,這個真的是太酷啦~~~~~~~

通過 TaskCompletionSource,我們可以:

  1. 將事件驅動轉為可 await 的異步操作
  2. 實現跨模塊異步處理客戶端消息
  3. 保持服務端與業務邏輯解耦
  4. 同時支持客戶端響應和模塊異步等待

核心模式:
HandlePackageAsync 觸發 → 外部模塊處理 → TaskCompletionSource.SetResult → 調用模塊 await 獲取結果

這種模式非常適合 SuperSocket、SignalR、WebSocket 等異步消息驅動場景。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/921177.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/921177.shtml
英文地址,請注明出處:http://en.pswp.cn/news/921177.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《IC驗證必看|semaphore與mailbox的核心區別》

月薪30K驗證工程師必答&#xff1a;SystemVerilog中semaphore與mailbox的核心區別&#xff0c;及必須用semaphore的場景深度解析 在驗證工程師的技能體系里&#xff0c;線程同步與資源管控是區分“基礎會用”&#xff08;20K水平&#xff09;和“精通工程化”&#xff08;30K水…

Spring線程池ThreadPoolTaskExecutor?詳解

ThreadPoolTaskExecutor?寫法Bean(name "taskExecutor") public ThreadPoolTaskExecutor taskExecutor() {ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor();executor.setCorePoolSize(8); // 8核CPU服務器建議值executor.setMaxPoolSize(…

Unity之安裝教學

UnityHub下載 下載官網地址&#xff1a;Unity Hub下載地址 打開網址右上角&#xff0c;登錄/注冊賬號 登錄完畢后&#xff0c;點擊下載 安裝Unity Hub 雙擊傻瓜式安裝 安裝完成 啟動UnityHub 雙擊啟動 左上角設置 設置中文 左上角登錄賬號 添加免費許可證 設置-許可證-添加 安裝…

Redis 集群模式與高可用機制

最近在準備面試&#xff0c;正把平時積累的筆記、項目中遇到的問題與解決方案、對核心原理的理解&#xff0c;以及高頻業務場景的應對策略系統梳理一遍&#xff0c;既能加深記憶&#xff0c;也能讓知識體系更扎實&#xff0c;供大家參考&#xff0c;歡迎討論。在分布式環境下&a…

Flutter + Web:深度解析雙向通信的混合應用開發實踐

Flutter Web&#xff1a;深度解析雙向通信的混合應用開發實踐 前言 在當今快速發展的移動應用開發領域&#xff0c;開發者們始終在尋求一種能夠平衡開發效率、跨平臺能力和用戶體驗的完美方案。原生開發性能卓越&#xff0c;但雙平臺&#xff08;iOS/Android&#xff09;開發…

如何查看Linux系統中文件夾或文件的大小

在日常運維和開發工作中&#xff0c;了解文件夾和文件占用的磁盤空間是非常重要的。尤其是當你在服務器上部署應用&#xff08;如 Jenkins&#xff09;時&#xff0c;合理監控磁盤使用情況可以避免磁盤空間不足導致的各種問題。在 Linux 系統中&#xff0c;我們可以使用一些簡單…

豪華酒店品牌自營APP差異對比分析到產品重構

一、萬豪國際集團旗下豪華酒店品牌及統一APP 萬豪旗下奢華品牌均整合于 「萬豪旅享家(Marriott Bonvoy)」APP,會員可通過該平臺預訂、管理積分及享受跨品牌服務。以下為核心豪華品牌: 1. 經典奢華品牌 麗思卡爾頓酒店(The Ritz-Carlton) 定位:頂級奢華,以管家服務、歷…

ESLint 相關

no-unused-vars 等常見報錯提醒關閉 1. no-unused-vars 報錯示例&#xff1a; useMemo is defined but never used no-unused-vars解決方式 方法一&#xff1a;局部禁用某一行 // eslint-disable-next-line no-unused-vars const result useMemo(() > {}, []);方法二&…

1分鐘生成爆款相聲對話視頻!Coze智能體工作流詳細搭建教程,小白也能輕松上手

最近看到一個賬號&#xff0c;用AI將傳統相聲對話做成趣味短視頻&#xff0c;單條播放量輕松破百萬。這種視 頻看似復雜&#xff0c;其實用Coze智能體工作流1分鐘就能搞定&#xff0c;完全不需要剪輯基礎。工作流功能 用Coze一鍵生成爆款相聲對話視頻&#xff0c;無需剪輯直接發…

pinia狀態管理工具

pinia狀態管理工具Pinia 是 Vue.js 官方推薦的新一代狀態管理庫&#xff0c;可以看作是 Vuex 的替代品。1. 什么是 Pinia&#xff1f; Pinia 是 Vue 的專屬狀態管理庫&#xff0c;它允許你跨組件或頁面共享狀態。由 Vue.js 核心團隊維護&#xff0c;并且對 TypeScript 有著極其…

【初始web3】什么是web3

前言你是否還記得&#xff0c;曾經在社交媒體上發布精彩內容&#xff0c;平臺卻隨意封禁你的賬號&#xff1f;你是否曾疑惑&#xff0c;為什么你創造的數據價值億萬&#xff0c;而你自己卻一無所獲&#xff1f;這&#xff0c;就是Web2時代的痛。而Web3的到來&#xff0c;正試圖…

構建下一代互聯網:解碼Web3、區塊鏈、協議與云計算的協同演進

我們正站在互聯網歷史性變革的門口。從只能讀取信息的Web1&#xff0c;到可以讀寫、高度中心化的Web2&#xff0c;我們即將邁入一個價值可以直接傳遞的Web3時代。這個新時代并非由單一技術驅動&#xff0c;而是由區塊鏈、去中心化協議和云計算等一系列技術的融合與協同所構建。…

小迪安全v2023學習筆記(七十六講)—— Fuzz模糊測試口令爆破目錄爆破參數爆破Payload爆破

文章目錄前記WEB攻防——第七十六天Fuzz模糊測試篇&JS算法口令&隱藏參數&盲Payload&未知文件目錄Fuzz知識含義Fuzz的核心思想Fuzz應用場景Fuzz應用Fuzz字典項目Fuzz技術 - 用戶口令-常規&模塊&JS插件常規模塊JS插件JsEncrypterBurpCryptoFuzz技術 - 目…

在windows server 2022搭建gitlab……但是失敗了

在windows server 2022搭建gitlab……但是失敗了1. 前言2. 安裝ubuntu環境2. 安裝docker3. 映射3.1 端口映射3.2 路徑映射1. 前言 上一篇&#xff1a;在windows本地機搭建gitlab 本來按理來說沒必要另起一篇&#xff0c;但是沒想到&#xff0c;在新機器的windows server 2022…

藍橋杯算法之基礎知識(4)

目錄 Ⅰ.sorted排序 Ⅱ.排序具體的方法 &#xff08;1&#xff09;sort的神方法&#xff08;注意是sort&#xff09; &#xff08;2&#xff09;sorted的神方法&#xff08;注意這里是sorted&#xff09; 常見場景 1. 單關鍵字排序 2. 多關鍵字排序 3.按倒序字符串排序&#xf…

GOFLY開源客服系統-處理gin框架下的session中間件

了解更多&#xff0c;搜索:"程序員老狼" 在當今數字化時代&#xff0c;在線客服系統已成為企業與客戶溝通的重要橋梁。作為GOFLY客服系統的開發者&#xff0c;我今天要分享我們如何在系統中實現安全可靠的會話管理機制——這是保障用戶數據安全的核心技術。 為什么…

Burp Suite 插件 | 提供強大的框架自動化安全掃描功能。目前支持1000+POC、支持動態加載POC、指定框架掃描。

工具介紹 Rinte 是一款專為滲透測試人員設計的 Burp Suite 插件&#xff0c;提供強大的自動化安全掃描功能。該插件集成了框架檢測、漏洞掃描和敏感路徑掃描等多種功能&#xff0c;幫助安全研究人員快速識別目標系統的安全漏洞。支持1000框架POC、支持動態加載POC、指定框架掃描…

記錄測試環境hertzbeat壓測cpu高,oom問題排查。jvm,mat,visulavm

記錄測試環境hertzbeat壓測cpu高&#xff0c;oom問題排查。jvm&#xff0c;mat&#xff0c;visulavm 一&#xff0c;問題背景 運維平臺&#xff0c;采用hertzbeat開源代碼進行采集。對單個設備連接&#xff0c;采集9個指標。目前hertzbeat對1個設備連接&#xff0c;下發9次單獨…

基于 CC-Link IE FB 轉 DeviceNet 技術的三菱 PLC 與發那科機器人在汽車涂裝線的精準噴涂聯動

案例背景在汽車制造行業&#xff0c;生產線的高效協同是提高生產效率和產品質量的關鍵。某汽車制造企業的車身焊接車間采用了基于 CC-Link IE FB 主站的三菱 Q 系列 PLC&#xff0c;憑借其強大的功能和穩定的性能&#xff0c;對焊接機器人等設備進行精準控制。而在涂裝車間&…

極空間打造 “超級中樞”,從書簽筆記到聊天分享,一鍵全搞定!

「NAS、鍵盤、路由器年輕就要多折騰&#xff0c;我是愛折騰的熊貓&#xff0c;今天又給大家分享最近折騰的內容了&#xff0c;關注是對我最大的支持&#xff0c;阿里嘎多」引言書簽項目熊貓介紹過不少啦&#xff0c;但今天要介紹的這個項目&#xff0c;大不一樣。平常的書簽&am…