当前位置: 首页 > ai >正文

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.xdnf.cn/news/641.html

相关文章:

  • 在FVM(有限体积法)的CFD仿真中,AI和机器学习的应用
  • npm link 使用指南
  • 【Rust 精进之路之第11篇-借用·实践】切片 (Slices):安全、高效地引用集合的一部分
  • Day96 | 灵神 | 二叉树 相同的树
  • javaSE.队列
  • Vue.js 简介
  • PCL库编译指南
  • 自然语言处理(9)—— 共现词矩阵及Python实现
  • MySQL完整版进阶及附录
  • STM32 HAL 水位传感器驱动程序
  • WEMOS LOLIN32 开发板引脚布局和技术规格
  • Python数据可视化领域的卓越工具:深入剖析Seaborn、Plotly与Pyecharts
  • 7、sentinel
  • Sentinel源码—6.熔断降级和数据统计的实现二
  • 深入浅出:LDAP 协议全面解析
  • 微前端框架 Wujie
  • Transformer系列(二):自注意力机制框架
  • 【2025最新redis数据结构之Hypeloglog介绍】关于Hypeloglog
  • JBoss + WildFly 本地开发环境完全指南
  • 卷积神经网络综述
  • 【重走C++学习之路】14、多态
  • 第二十节:项目经验-描述一个React性能优化案例
  • 21. git apply
  • 时序预测 | Transformer-LSTM-SVM时间序列预测(Matlab完整源码和数据,适合基础小白研究)
  • 《前端面试题之 Vue 篇(第三集)》
  • 【滑动窗口】找到字符串中所有字⺟异位词(medium)
  • 计算机组成原理笔记(十六)——4.1基本算术运算的实现
  • 8、constexpr if、inline、类模版参数推导、lambda的this捕获---c++17
  • 【滑动窗口】串联所有单词的⼦串(hard)
  • 常用的几种 Vue 父子组件传值方式