使用IAsyncResult 对象的异步操作与使用事件的异步操作
### 使用 IAsyncResult 对象的异步操作与使用事件的异步操作 在.NET框架中,异步编程模型(Asynchronous Programming Model, APM)是一种常用的技术来处理长时间运行的操作,如磁盘I/O、网络通信等,从而避免阻塞主线程。其中,`IAsyncResult`接口是APM的核心之一,它提供了异步操作的状态信息。此外,通过事件来实现异步操作也是另一种常见的方式。下面将详细介绍这两种方法,并给出示例代码。 #### IAsyncResult 接口 `IAsyncResult`是一个公共接口,用于表示异步操作的结果。该接口定义了以下四个成员: 1. **AsyncState**:一个对象,用于保存异步操作的状态信息。通常用于传递回调方法中需要使用的额外数据。 2. **AsyncWaitHandle**:返回一个`WaitHandle`,可以用来等待异步操作完成。 3. **CompletedSynchronously**:布尔值,表示异步操作是否在同步上下文中完成。 4. **IsCompleted**:布尔值,表示异步操作是否已完成。 #### 使用 `IAsyncResult` 实现异步操作 为了演示如何使用`IAsyncResult`来实现异步操作,我们创建了一个名为`AsyncDemo`的类。该类包括同步方法`Run`、异步开始方法`BeginRun`以及异步结束方法`EndRun`。 1. **同步方法 Run**: ```csharp public string Run() { return "My name is " + m_Name; } ``` 2. **异步开始方法 BeginRun**: ```csharp public IAsyncResult BeginRun(AsyncCallback callBack, Object stateObject) { try { return m_Delegate.BeginInvoke(callBack, stateObject); } catch (Exception e) { throw e; } } ``` 这个方法接收一个`AsyncCallback`委托和一个状态对象作为参数,并调用`BeginInvoke`方法启动异步操作。 3. **异步结束方法 EndRun**: ```csharp public string EndRun(IAsyncResult ar) { if (ar == null) throw new NullReferenceException("Argument ar can't be null"); try { return m_Delegate.EndInvoke(ar); } catch (Exception e) { throw e; } } ``` 此方法根据传入的`IAsyncResult`对象获取异步操作的结果。 #### 主程序中的异步操作 在主程序中,我们可以使用如下方式来执行异步操作: ```csharp AsyncDemo demo = new AsyncDemo("jiangnii"); IAsyncResult ar = demo.BeginRun(null, null); // 执行异步开始方法 string demoName = demo.EndRun(ar); // 使用异步结束方法阻塞线程直到操作完成 ``` #### 使用 `AsyncWaitHandle` 控制阻塞时间 除了`EndRun`方法外,我们还可以利用`AsyncWaitHandle`属性配合`WaitOne`方法来控制阻塞的时间。例如,若希望阻塞1秒钟,可以这样做: ```csharp ar.AsyncWaitHandle.WaitOne(1000); // 阻塞线程1秒 ``` #### 使用事件实现异步操作 另一种实现异步操作的方式是通过事件。这种方式通常用于UI线程上,例如在WPF或Windows Forms应用中。当异步操作完成时,会触发一个事件通知UI线程更新界面。 无论是使用`IAsyncResult`还是事件来实现异步操作,其核心都是将长时间运行的任务放在非UI线程中执行,从而提高应用程序的响应性。选择哪种方式取决于具体的应用场景和个人偏好。
IAsyncResult 异步设计模式通过名为 BeginOperationName 和 EndOperationName 的两个方法来实现原同步方法的异步调用,如 FileStream 类提供了 BeginRead 和 EndRead 方法来从文件异步读取字节,它们是 Read 方法的异步版本
Begin 方法包含同步方法签名中的任何参数,此外还包含另外两个参数:一个AsyncCallback 委托和一个用户定义的状态对象。委托用来调用回调方法,状态对象是用来向回调方法传递状态信息。该方法返回一个实现 IAsyncResult 接口的对象
End 方法用于结束异步操作并返回结果,因此包含同步方法签名中的 ref 和 out 参数,返回值类型也与同步方法相同。该方法还包括一个 IAsyncResult 参数,用于获取异步操作是否完成的信息,当然在使用时就必须传入对应的 Begin 方法返回的对象实例
开始异步操作后如果要阻止应用程序,可以直接调用 End 方法,这会阻止应用程序直到异步操作完成后再继续执行。也可以使用 IAsyncResult 的 AsyncWaitHandle 属性,调用其中的WaitOne等方法来阻塞线程。这两种方法的区别不大,只是前者必须一直等待而后者可以设置等待超时
如果不阻止应用程序,则可以通过轮循 IAsyncResult 的 IsCompleted 状态来判断操作是否完成,或使用 AsyncCallback 委托来结束异步操作。AsyncCallback 委托包含一个 IAsyncResult 的签名,回调方法内部再调用 End 方法来获取操作执行结果
尝试
先来熟悉一下今天的主角,IAsyncResult 接口
public interface IAsyncResult
{
object AsyncState { get; }
WaitHandle AsyncWaitHandle { get; }
bool CompletedSynchronously { get; }
bool IsCompleted { get; }
}
我用一个 AsyncDemo 类作为异步方法的提供者,后面的程序都会调用它。内部很简单,构造函数接收一个字符串作为 name ,Run 方法输出 "My name is " + name ,而异步方法直接用委托的 BeginInvoke 和 EndInvoke 方法实现
public class AsyncDemo
{
private delegate string runDelegate();
private string m_Name;
private runDelegate m_Delegate;
public AsyncDemo(string name)
{
m_Name = name;
m_Delegate = new runDelegate(Run);
}
/**/
///
/// Synchronous method
///
///
public string Run()
{
return "My name is " + m_Name;
}
/**/
///
/// Asynchronous begin method
///
///
///
///
public IAsyncResult BeginRun(AsyncCallback callBack, Object stateObject)
{
try
{
return m_Delegate.BeginInvoke(callBack, stateObject);
剩余6页未读,继续阅读
- 粉丝: 0
- 资源: 8
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 光伏逆变器设计方案TMS320F28335-176资料 PCB 原理图 源代码 1. 本设计DC-DC采用Boost升压,DCAC采用单相全桥逆变电路结构 2. 以TI公司的浮点数字信号控制器TMS
- 通讯录排序-基于Python实现的通讯录多维度排序方法
- 全志V3S linux qt程序实现按键控制LED灯代码.zip
- allwinner全志-V3S-LINUX-QT-实现RJ45以太网数据收发通讯.zip
- allwinner全志-V3S-LINUX-QT-第一个程序实现helloword.zip
- 扑克牌数字检测19-YOLO(v5至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar
- allwinner全志-V3S-LINUX-QT-GC0308摄像头实现人脸检测-MTCNN神经网络-OPENCV-FACENET.zip
- 毕业设计-基于SpringBoot+Mybatis开发的分布式校园租赁系统全部资料+详细文档+高分项目.zip
- 毕业设计-基于java的校园二手交易系统全部资料+详细文档+高分项目.zip
- 毕业设计-基于Hadoop的校园资源云存储的设计与开发全部资料+详细文档+高分项目.zip
- 毕业设计-基于tp5的校园生活系统全部资料+详细文档+高分项目.zip
- 毕业设计-基于SpringBoot的二手商城系统、二手交易平台,校园二手书籍交易,社区二手交易平台全部资料+详细文档+高分项目.zip
- 基于 Next.js(RSC) & tRPC 的多功能校园表白墙论坛系统校园万能墙全部资料+详细文档+高分项目.zip
- 基于 Laravel 校园二手交易平台全部资料+详细文档+高分项目.zip
- 基于 微信小程序-云开发 的校园服务平台(提供二手交易和失物招领功能)全部资料+详细文档+高分项目.zip
- 基于 React Native 的校园社交APP.全部资料+详细文档+高分项目.zip