.net C# 中的APM异步编程方式

APM(Asynchrocous Programming Model)方式:

通过委托类异步调用方法:

1.定义一个委托类型:

delegate int MyDeletateType(string s);

2.实例化一个委托实例,构造时候传入需要异步调用的函数FuncA

var del = new MyDeletateType(FuncA);

int FuncA(string a)
{
Console.WriteLine(a);
return 1;
}

或者

var del = new MyDeletateType((a)=> {Console.WriteLine(a);return 1;});

3.通过委托异步调用方法:

del.BeginInvoke("hello", null, null);

4.上述方法是 IAsyncResult BeginInvoke(string s,AsyncCallback callback,object @object)

string s对应异步调用的函数FunA的入参,AsyncCallback callback是回调函数的委托实例,object @object是用户自定义的参数,该参数存放在IAsyncResult ar中的AsyncState中;

其中用于回调函数的委托实例是

public delegate void AsyncCallback(IAsyncResult ar);

BeginInvoke调用后 会马上返回IAsyncResult,同时异步调用函数FuncA。FuncA完成后,调用回调函数,回调函数中入参是同一份的IAsyncResult.

则:

如果需要向回调函数传入参数,可以使用BeginInvoke中的object参数,此参数存放在IAsyncResult .AsyncState中,回调函数中可以获取此参数,由于IAsyncResult .AsyncState 只读,回调函数对该参数不作修改。(若object存入的是引用类型,则可修改实例对象内容)

调用BeginInvoke方法后返回IAsyncResult ,

可以使用IsCompleted:bool判断异步方法是否完成,异步方法完成后,则该标志位为true,然后开始调用回调函数。

可以使用AsyncWaitHandle.WaitOne() 等待异步调用的方法完成。完成后WaitOne返回True;有重载函数WaitOne(Timespan timeOut)等方法,指定等待一定时间,如果时间范围内异步方法执行完成,则马上返回true,如果设定时间范围内,异步方法未完成,则返回false.

因此:

可以使用轮询IsCompleted属性的方法,及WaitOne()的方法判断异步方法是否完成。

最后,调用方调用异步方法后如何能获取异步方法的返回值呢。可以使用MyDelegate中的int EndInvoke(IAsyncResult ar)方法。

var del = new MyDeletateType((a) => { Console.WriteLine(a); return 1; });
var asyncResult = del.BeginInvoke("hello", null, null);
var result = del.EndInvoke(asyncResult);

EndInvoke方法等待异步方法完成及返回异步方法返回的结果。

APM的缺点是

1.调用后无法取消异步方法的执行

2.调用后不知道异步方法执行的进度

3.异步方法在另一条线程中执行,和调用方的线程非同一条线程。有时候会引起线程安全的问题。

为了解决这些问题,微软推出了其他的异步模式。

时间: 2024-10-09 23:19:16

.net C# 中的APM异步编程方式的相关文章

c#中的Task异步编程

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/index翻译 1. 引入 Task异步编程模型(TAP)提供了对异步代码的抽象,将代码作为语句序列,可以在每个阶段完成下个阶段开始前读取代码,该过程中,编译器进行了多次转换,因为一些语句可能启动工作并返回正在进行的工作任务. Task异步编程的目标就是,启动类似于语句序列的代码,但当任务执行完成时,基于外部资源分配以一个更复杂的顺序执行

js中同步与异步请求方式

异步请求方式: $.ajax({ url : 'your url', data:{name:value}, cache : false, async : true, type : "POST", dataType : 'json/xml/html', success : function (result){ do something.... } }); 同步请求方式: $.ajax({ url : 'your url', data:{name:value}, cache : false

Play!中使用HTTP异步编程

本章译者:@Sam Liu (译者未留下自己的主页,请Sam Liu见此文,加入群168013302联系‘大黄蜂@翻译play’) 这一章主要讲解如何运用异步模式实现典型的长连接(long-polling).流(streaming)和 推送方式(Comet-style ) 的编程,以便于响应数以千万计的并发请求. 延缓(Suspending) HTTP 请求 Play主要是用于处理很短的请求.它使用一个固定的线程池来处理用户的HTTP请求.为获得最佳效果,这个线程池当然是越小越好.我们一般用@处

APM异步编程模型

使用 IAsyncResult 设计模式的异步操作 是通过名为 "Begin" 操作名称OperationName 和 "End"操作名称OperationName 的两个方法来实现的, 这两个方法分别开始和结束异步操作 操作名称OperationName. 例如,FileStream 类提供 BeginRead 和 EndRead 方法来从文件异步读取字节. 这两个方法实现了 Read 方法的异步版本. 在调用"Begin" 操作名称Opera

C# 异步编程1 APM模式异步程序开发

C#已有10多年历史,单从微软2年一版的更新进度来看活力异常旺盛,C#中的异步编程也经历了多个版本的演化,从今天起着手写一个系列博文,记录一下C#中的异步编程的发展历程.广告一下:喜欢我文章的朋友,请点下面的“关注我”.谢谢 我是2004年接触并使用C#的,那时C#版本为1.1,所以我们就从就那个时候谈起.那时后在大学里自己看书写程序,所写的程序大都是同步程序,最多启动个线程........其实在C#1.1的时代已有完整的异步编程解决方案,那就是APM(异步编程模型).如果还有不了解“同步程序.

.net异步编程の-------异步编程模型(APM)

术语解释: APM               异步编程模型, Asynchronous Programming Model EAP                基于事件的异步编程模式, Event-based Asynchronous Pattern TAP                基于任务的异步编程模式, Task-based Asynchronous Pattern 一.异步编程 APM即异步编程模型的简写(Asynchronous Programming Model),大家在写代

一种C# TCP异步编程中遇到的问题

最近在维护公司的一个socket服务端工具,该工具主要是提供两个socket server服务,对两端连接的程序进行数据的透明转发. 程序运行期间,遇到一个问题,程序的一端是GPRS设备,众所周知,GPRS设备的网络连接十分的不问题,由此会产生不少的"奇怪"问题.实际过程中,程序运行几个小时后,无线端的socket server断开就再也无法打开.找了很久都没发现. 通过wireshark抓取通信报文,一般是在TCP的三次握手时出的问题.常规的TCP三次握手,由TCP的标识可简单看作:

Async in C# 5.0(C#中的异步编程Async) 蜗牛翻译之第一章

p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提高下英文,用我拙劣的英文翻译一些重要的部分,纯属娱乐,简单分享,保持学习,谨记谦虚. 如果你觉得这件事儿没意义翻译的又差,尽情的踩吧.如果你觉得值得鼓励,感谢留下你的赞,祝各位爱技术的园友在今后每一次应该猛烈突破的时候,不选择知难而退.在每一次应该独立思考的时候,不选择随波逐流,应该全力以赴的时候,不选择尽力

探究SynchronizationContext在.Net异步编程中的地位

原文:探究SynchronizationContext在.Net异步编程中的地位 引言: 多线程编程/异步编程非常复杂,有很多概念和工具需要去学习,贴心的.NET提供Task线程包装类和await/async异步编程语法糖简化了异步编程方式. 相信很多开发者都看到如下异步编程实践原则:   实践原则  说明  例外情况  ①  避免 Async Void  最好使用 async Task 方法而不是 async void 方法  事件处理程序  ②  始终使用 await  不要混合阻塞式代码和