2.1 基于委托的異步編程方法

????????基于委托的異步編程模型是 .NET 早期版本中實現異步操作的一種方式,主要通過?BeginInvoke?和?EndInvoke?方法來實現。這種基于委托的異步模式已被?Task?和?async/await?模式取代,但在維護舊代碼時仍可能遇到這種模式。

? ? ? ? 委托的方法中:Invoke用于同步調用;? 而BeginInvoke與EndInvoke用于異步調用。

一、具體介紹:

1.1 異步調用BeginInvoke?方法:
調用格式是:BeginInvoke( 委托的參數,AsyncCallback類型的回調函數,一個object對象),? ? ? 該回調函數是在委托完成后自動調用的函數。 object對象是任何一種對象,可以傳遞給委托函數。

? ? ? ? 特點如下:
? ? ? ? a. 主線程調用此函數后,立即返回,不等待調用完成
? ? ? ? b.? 返回?IAsyncResult?用于監視調用狀態. 在EnInvoke中使用該返回值

1.2 EndInvoke?方法:
????????用于獲取異步調用的結果;調用此方法后,如果操作未完成,會阻塞調用線程直到完成。

? ? ? ? 而且:如果委托函數中有exception異常,是在調用EndInvoke時觸發這個異常的。即即使委托執行中有異常,如果后面沒有調用EndInvoke這個異常不會被程序捕獲到。
? ? ? ? 使用方法如下:

? ? ? ? a = delfun.BeginInvoke(....)

? ? ? ? 結果 = delfun.EndInvoke(a).

1.3?回調函數:
????????當異步操作完成時自動調用; 一般在回調函數中調用?EndInvoke得到結果。
?

1.4?IAsyncResult? 對象

? ? ? 屬性:?IsCompleted? ?委托是否完成(包括正常完成、異常完成)

? ? ? ?委托:AsyncDelegate

? ? ? 傳入的參數:?AsyncState,即調用beginInvoke時傳入的最后一個參數,若不試用,可以是null;

二、實際案例如下:

? ? ? ? 本案例包含委托的異步調用、回調函數,得到結果,以及委托的取消。

 public partial class BackgroundDemo : Window{delegate int CalculateDelegate(int x, int y, CancellationToken ct);CancellationTokenSource cts = null;public BackgroundDemo(){InitializeComponent();          btnCancel.IsEnabled = false;cts = new CancellationTokenSource();}int CalculateSum(int a, int b, CancellationToken ct){Console.WriteLine("計算開始子線程ID: " + Thread.CurrentThread.ManagedThreadId);for (int i = 0; i < 20; i++){ct.ThrowIfCancellationRequested();                Thread.Sleep(1000);}                 return a + b;}void CalculationComplete(IAsyncResult result){CalculateDelegate calculate = (CalculateDelegate)result.AsyncState;var arResult = result as AsyncResult;try{int sum = calculate.EndInvoke(result);Console.WriteLine("回調中獲取結果: " + sum + " (線程ID: " + Thread.CurrentThread.ManagedThreadId + ")");}catch(OperationCanceledException ex){Console.WriteLine("回調時發現:任務取消: " + " (線程ID: " + Thread.CurrentThread.ManagedThreadId + ")");}this.Dispatcher.BeginInvoke((Action)delegate{this.btnStart.IsEnabled = true;});Console.WriteLine("------------結束----------------");}private void btnStart_Click(object sender, RoutedEventArgs e){this.btnStart.IsEnabled = false;this.btnCancel.IsEnabled = true;// 如果需要重置,首先取消當前的令牌cts.Cancel();// 然后釋放資源cts.Dispose();// 重新創建 CancellationTokenSourcects = new CancellationTokenSource();this.tbInfo.Text = "開始計算中";Console.WriteLine("------------開始------------");Console.WriteLine("UI線程ID: " + Thread.CurrentThread.ManagedThreadId  );CalculateDelegate cal = CalculateSum;cal.BeginInvoke(4, 5,cts.Token,  CalculationComplete, cal);}private void btnCancel_Click(object sender, RoutedEventArgs e){this.btnCancel.IsEnabled = false;cts.Cancel();}
}

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

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

相關文章

【Bluedroid】藍牙 HID 設備信息加載與注冊機制及配置緩存系統源碼解析

本篇解析Android藍牙子系統加載配對HID設備的核心流程,通過btif_storage_load_bonded_hid_info實現從NVRAM讀取設備屬性、驗證綁定狀態、構造描述符并注冊到BTA_HH模塊。重點剖析基于ConfigCache的三層存儲架構(全局配置/持久設備/臨時設備),其通過動態持久化判定策略和LRU…

Linux 下的網絡管理(附加詳細實驗案例)

一、簡單了解 NM&#xff08;NetworkManager&#xff09; 在 Linux 中&#xff0c;NM 是 NetworkManager 的縮寫。它是一個用于管理網絡連接的守護進程和工具集。 在 RHEL9 上&#xff0c;使用 NM 進行網絡配置&#xff0c;ifcfg &#xff08;也稱為文件&#xff09;將不再…

長連接、短連接與WebSocket的基本知識

目錄 前言正文 前言 &#x1f91f; 找工作&#xff0c;來萬碼優才&#xff1a;&#x1f449; #小程序://萬碼優才/r6rqmzDaXpYkJZF 爬蟲神器&#xff0c;無代碼爬取&#xff0c;就來&#xff1a;bright.cn Java基本知識&#xff1a; java框架 零基礎從入門到精通的學習路線 附…

2026《數據結構》考研復習筆記四(緒論)

緒論 前言時間復雜度分析 前言 由于先前筆者花費約一周時間將王道《數據結構》知識點大致過了一遍&#xff0c;圈畫下來疑難知識點&#xff0c;有了大致的知識框架&#xff0c;現在的任務就是將知識點逐個理解透徹&#xff0c;并將leetcode刷題與課后刷題相結合。因此此后的過…

Vmware安裝centos7和Redis

2025最詳細vmware安裝centos 7 教程_嗶哩嗶哩_bilibili 1.上面是B站安裝Centos7參考視頻 2.安裝完成需要配置網絡 (新手教程)VMware安裝CentOS7_嗶哩嗶哩_bilibili 重啟網絡服務: ping www.baidu.com ip addr 查看ip地址 兩種重啟方式 3.關閉防火墻 依次執行如下三條命令 …

二進制部署Kubernetes1.32.4最新版本高可用集群及附加組件

一、前言 在云原生技術席卷全球的今天&#xff0c;Kubernetes&#xff08;K8s&#xff09;已成為容器編排領域的事實標準。當大家都習慣了kubeadm、kubeasz等自動化工具一鍵部署的便利時&#xff0c;選擇通過二進制方式手動搭建K8s集群更像是一場"知其然亦知其所以然&qu…

樹莓派系統中設置固定 IP

在基于 Ubuntu 的樹莓派系統中&#xff0c;設置固定 IP 地址主要有以下幾種方法&#xff1a; 方法一&#xff1a;使用 Netplan 配置&#xff08;Ubuntu 18.04 及以上版本默認使用 Netplan&#xff09; 查看網絡接口名稱 在終端輸入ip link或ip a命令&#xff0c;查看當前所使…

主流單片機與編程調試工具對應關系表梳理

單片機系列/型號 | 官方IDE/工具鏈 | 調試器/燒錄器 | 第三方支持工具 |調試接口協議 | 特點與適用場景| | STMicroelectronics (STM32) STM32全系列 STM32CubeIDE ST-LINK/V2/V3 - PlatformIO (VS Code插件) SWD/JTAG 官方集成開發環境&#xff0c;支持HAL庫&#xff0c;免費…

VulnHub-DarkHole_2靶機滲透教程

1.靶機部署 [Onepanda] Mik1ysomething 靶機下載&#xff1a;https://download.vulnhub.com/darkhole/darkhole_2.zip 直接使用VMware導入打開就行 注意&#xff1a;靶機的網絡連接模式必須和kali一樣&#xff0c;讓靶機跟kali處于同一網段&#xff0c;這樣kali才能掃出靶機…

USO服務器操作系統手動升級GCC 12.2.0版本

1. 從 GNU 官方 FTP 服務器下載 GCC 12.2.0 的源碼包&#xff0c;并解壓進入源碼目錄。 wget https://ftp.gnu.org/gnu/gcc/gcc-12.2.0/gcc-12.2.0.tar.gz tar -zxvf gcc-12.2.0.tar.gz cd gcc-12.2.0 2. 運行腳本下載并配置 GCC 編譯所需的依賴庫。此步驟會自動下載如 GMP…

設計模式基礎概念(行為模式):觀察者模式(Observer)

概述 我們可以發現這樣一個場景&#xff1a;如果你訂閱了一份雜志或報紙&#xff0c; 那就不需要再去報攤查詢新出版的刊物了。 出版社 &#xff08;即應用中的 “發布者&#xff08;publisher&#xff09;”&#xff09; 會在刊物出版后 &#xff08;甚至提前&#xff09; 直…

JavaFX實戰:從零到一實現一個功能豐富的“高級反應速度測試”游戲

大家好&#xff01;今天我們不搞簡單的“紅變綠就點”了&#xff0c;來點硬核的&#xff01;我們要用 JavaFX 從頭開始&#xff0c;構建一個更復雜、更有趣也更考驗能力的“高級反應速度測試”游戲。這個版本將引入選擇反應時 (Choice Reaction Time) 的概念——你需要在多個干…

CSS 選擇器介紹

CSS 選擇器介紹 1. 基本概念 CSS&#xff08;層疊樣式表&#xff09;是一種用于描述 HTML 或 XML 文檔外觀的語言。通過 CSS&#xff0c;可以控制網頁中元素的布局、顏色、字體等視覺效果。而 CSS 選擇器則是用來指定哪些 HTML 元素應該應用這些樣式的工具。 2. 基本選擇器 …

Vue3父子組件數據同步方法

在 Vue 3 中&#xff0c;當子組件需要修改父組件傳遞的數據副本并同步更新時&#xff0c;可以通過以下步驟實現&#xff1a; 方法 1&#xff1a;使用 v-model 和計算屬性&#xff08;實時同步&#xff09; 父組件&#xff1a; vue <template><ChildComponent v-mo…

el-table中el-input的autofocus無法自動聚焦的解決方案

需求 有一個表格展示了一些進度信息&#xff0c;進度信息可以修改&#xff0c;需要點擊進度信息旁邊的編輯按鈕時&#xff0c;把進度變為輸入框且自動聚焦&#xff0c;當鼠標失去焦點時自動請求更新接口。 注&#xff1a;本例以vue2 element UI為例 分析 這個需求看著挺簡單…

用高斯濺射技術跨越機器人模擬與現實的鴻溝:SplatSim 框架解析

在機器人領域&#xff0c;讓機器人在現實世界中精準執行任務是大家一直追求的目標。可模擬環境和現實世界之間存在著不小的差距&#xff0c;特別是基于 RGB 圖像的操作策略&#xff0c;從模擬轉移到現實時總是狀況百出。 今天咱們就來聊聊 SplatSim 框架&#xff0c;看看它是怎…

【自然語言處理與大模型】如何知道自己部署的模型的最大并行訪問數呢?

當你自己在服務器上部署好一個模型后&#xff0c;使用場景會有兩種。第一種就是你自己去玩&#xff0c;結合自有的數據做RAG等等&#xff0c;這種情況下一般是不會考慮并發的問題。第二種是將部署好的服務給到別人來使用&#xff0c;這時候就必須知道我的服務到底支持多大的訪問…

[FPGA基礎] UART篇

Xilinx FPGA UART 硬件接口使用指南 1. 引言 UART (通用異步收發器) 是一種廣泛使用的串行通信接口&#xff0c;因其簡單、可靠和易于實現而成為 Xilinx FPGA 設計中的常見硬件接口。UART 用于在 FPGA 與外部設備&#xff08;如 PC、微控制器、傳感器等&#xff09;之間進行數…

【Netty4核心原理】【全系列文章目錄】

文章目錄 一、前言二、目錄 一、前言 本系列雖說本意是作為 《Netty4 核心原理》一書的讀書筆記&#xff0c;但在實際閱讀記錄過程中加入了大量個人閱讀的理解和內容&#xff0c;因此對書中內容存在大量刪改。 本系列內容基于 Netty 4.1.73.Final 版本&#xff0c;如下&#xf…

用 PyTorch 和numpy分別實現簡單的 CNN 二分類器

作業用到的知識&#xff1a; 1.Pytorch: 1. nn.Conv2d&#xff08;二維卷積層&#xff09; 作用&#xff1a; 對輸入的多通道二位數據&#xff08;如圖像&#xff09;進行特征提取&#xff0c;通過滑動卷積核計算局部區域的加權和&#xff0c;生成新的特征圖。 關鍵參數&a…