您的位置:首页 > 编程语言 > C#

[转]C#基础学习--异步编程篇

2008-10-21 13:28 316 查看
本文转自:http://www.cnblogs.com/jiangnii/archive/2007/08/05/843872.aspx

C#基础学习 —— 异步编程篇 1
.NET Framework 为异步操作提供了两种设计模式:使用 IAsyncResult 对象的异步操作与使用事件的异步操作。先来学习前者

概述

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
public class AsyncDemo
class AsyncTest
class AsyncTest
class AsyncTest
class AsyncTest
class BackgroundWorkerDemo
public BackgroundWorkerDemo(string filePath)
private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
private void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
public void ReadAsync()
class BackgroundWorkerTest
{
{
Console.Write("Input file path: ");
string filePath = Console.ReadLine();

BackgroundWorkerDemo demo = new BackgroundWorkerDemo(filePath);
demo.ReadAsync();

// Thread waiting
Console.ReadLine();
}
}

其他

回顾一下我用委托实现 IAsyncResult 模式的 Demo ,与用 BackgroundWorker 实现的基于事件的异步模式很相似吧。而且应用程序可以通过委托的 BeginInvoke 和 EndInvoke 方法来异步执行现有的同步方法而不需要作额外的修改,BackgroundWorker 也差不多是一样。我把这两者看成实现对应异步操作模式的范本,在性能要求不是很高的一些异步操作场合,用好委托和 BackgroundWorker 就可以简单有效的完成开发了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: