异步编程:异步编程模型(APM)
作者:网络转载 发布时间:[ 2013/4/3 9:49:50 ] 推荐标签:
使用上面通过IAsyncResult设计模式实现的带ref引用参数的异步操作,我将展示三种阻塞式响应异步调用和一种无阻塞式委托响应异步调用。即:
1、执行异步调用后,若我们需要控制后续执行代码在异步操作执行完之后执行,可通过下面三种方式阻止其他工作:
a)IAsyncResult的AsyncWaitHandle属性,待异步操作完成时获得信号。
b)通过IAsyncResult的IsCompleted属性进行轮询。通过轮询还可实现进度条功能。
c)调用异步操作的 End*** 方法。
2、执行异步调用后,若我们不需要阻止后续代码的执行,那么我们可以把异步执行操作后的响应放到回调中进行。
public class Calculate_Test
{
public static void Test()
{
CalculateLib cal = new CalculateLib();
// 基于IAsyncResult构造一个异步API
IAsyncResult calculateResult = cal.BeginCalculate(123, 456, AfterCallback, cal);
// 执行异步调用后,若我们需要控制后续执行代码在异步操作执行完之后执行,可通过下面三种方式阻止其他工作:
// 1、IAsyncResult 的 AsyncWaitHandle 属性,带异步操作完成时获得信号。
// 2、通过 IAsyncResult 的 IsCompleted 属性进行轮询。通过轮询还可实现进度条功能。
// 3、调用异步操作的 End*** 方法。
// ***********************************************************
// 1、calculateResult.AsyncWaitHandle.WaitOne();
// 2、while (calculateResult.IsCompleted) { Thread.Sleep(1000); }
// 3、
string resultStr = string.Empty;
int result = cal.EndCalculate(ref resultStr, calculateResult);
}
/// <summary>
/// 异步操作完成后做出响应
/// </summary>
private static void AfterCallback(ref string resultStr, IAsyncResult ar)
{
// 执行异步调用后,若我们不需要阻止后续代码的执行,那么我们可以把异步执行操作后的响应放到回调中进行。
CalculateLib cal = ar.AsyncState as CalculateLib;
//int result = cal.EndInvoke(ref resultStr, calculateResult1);
//if (result > 0) { }
}
}
二、使用委托进行异步编程
对于委托,编译器会为我们生成同步调用方法“invoke”以及异步调用方法“BeginInvoke”和“EndInvoke”。对于异步调用方式,公共语言运行库 (CLR) 将对请求进行排队并立即返回到调用方,由线程池的线程调度目标方法并与提交请求的原始线程并行运行。
异步委托是快速为方法构建异步调用的方式,它基于IAsyncResult设计模式实现的异步调用,即,通过BeginInvoke返回IAsyncResult对象;通过EndInvoke获取结果值。
示例:
上节的CalculateLib类中的同步方法以及所要实用到的委托如下:
// 带ref参数的自定义委托
public delegate int AsyncInvokeDel(int num1, int num2, ref string resultStr);
public int Calculate(int num1, int num2, ref string resultStr)
{
resultStr = (num1 * num2).ToString();
return num1 * num2;
}
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11