一.如何使用异步模式?

  异步模式是在处理流类型时经常采用的一种方式,其应用的领域相当广阔,包括读写文件、网络传输、读写数据库,甚至可以采用异步模式来做任何计算工作。相对于手动编写线程代码,异步模式是一个高效的编程模式。

  (1)所谓异步模式是个什么鬼?

     在启动一个操作之后可以继续执行其他工作而不会发生阻塞

以读取文件为例,在同步模式下,当程序执行到Read方法时,需要等到读取动作结束后才能继续往下执行。而异步模式则可以简单地通知开始读取任务之后,继续其他的操作。 异步模式的优点就在于不需要使当前线程等待,而可以充分地利用CPU时间。

异步模式区别于线程池机制在于允许程序查看操作的执行状态,而利用线程池的后台线程,则无法确切地知道操作的进行状态以及其是否已经结束。

  使用异步模式可以通过一些异步聚集技巧来查看异步操作的结果,所谓的聚集技巧是指查看操作是否结束的方法,方式是:在调用BeingXXX方法时传入操作结束后需要执行的方法(又称为回调方法),同时把执行异步操作的对象传入以便执行EndXXX方法

  (2)使用异步模式读取一个文件

  下面的示例代码中:

  ① 主线程中负责开始异步读取并传入聚集时需要使用的方法和状态对象:

    partial class Program
{
// 测试文件
private const string testFile = @"C:\AsyncReadTest.txt";
private const int bufferSize = ; static void Main(string[] args)
{
// 删除已存在文件
if (File.Exists(testFile))
{
File.Delete(testFile);
} // 写入一些东西以便后面读取
using (FileStream stream = File.Create(testFile))
{
string content = "我是文件具体内容,我是不是帅得掉渣?";
byte[] contentByte = Encoding.UTF8.GetBytes(content);
stream.Write(contentByte, , contentByte.Length);
} // 开始异步读取文件具体内容
using (FileStream stream = new FileStream(testFile, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, FileOptions.Asynchronous))
{
byte[] data = new byte[bufferSize];
// 将自定义类型对象实例作为参数
ReadFileClass rfc = new ReadFileClass(stream, data);
// 开始异步读取
IAsyncResult result = stream.BeginRead(data, , data.Length, FinshCallBack, rfc);
// 模拟做了一些其他的操作
Thread.Sleep( * );
Console.WriteLine("主线程执行完毕,按回车键退出程序");
} Console.ReadKey();
}
}

  ② 定义了完成异步操作读取之后需要调用的方法,其逻辑是简单地打印出文件的内容:

    partial class Program
{
/// <summary>
/// 完成异步操作后的回调方法
/// </summary>
/// <param name="result">状态对象</param>
private static void FinshCallBack(IAsyncResult result)
{
ReadFileClass rfc = result.AsyncState as ReadFileClass;
if (rfc != null)
{
// 必须的步骤:让异步读取占用的资源被释放掉
int length = rfc.stream.EndRead(result);
// 获取读取到的文件内容
byte[] fileData = new byte[length];
Array.Copy(rfc.data, , fileData, , fileData.Length);
string content = Encoding.UTF8.GetString(fileData);
// 打印读取到的文件基本信息
Console.WriteLine("读取文件结束:文件长度为[{0}],文件内容为[{1}]", length.ToString(), content);
}
}
}

  ③ 定义了作为状态对象传递的类型,这个类型对所有需要传递的数据包进行打包:

    /// <summary>
/// 传递给异步操作的回调方法
/// </summary>
public class ReadFileClass
{
// 以便回调方法中释放异步读取的文件流
public FileStream stream;
// 文件内容
public byte[] data; public ReadFileClass(FileStream stream,byte[] data)
{
this.stream = stream;
this.data = data;
}
}

  下图展示了该实例的执行结果:

  如上面的实例,使用回调方法的异步模式需要将异步操作的对象及操作的结果数据都打包到一个类型里以便能够传递回给回调的委托方法,这样在委托方法中才能够有机会处理操作的结果且调用EndXXX方法以释放资源。

.NET基础拾遗(7)多线程开发基础3的更多相关文章

  1. .NET基础拾遗(5)多线程开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  2. .NET基础拾遗(7)多线程开发基础4

    一.多线程编程中的线程同步 1.C#中的lock关键字 lock关键字可能是我们在遇到线程同步的需求时最常用的方式,但lock只是一个语法糖,为什么这么说呢,下面慢慢道来. (1)lock的等效代码其 ...

  3. .NET基础拾遗(7)多线程开发基础2

    二..NET中的多线程编程 2.1 如何在.NET程序中手动控制多个线程? 最直接且灵活性最大的,莫过于主动创建.运行.结束所有线程. (1)第一个多线程程序 .NET提供了非常直接的控制线程类型的类 ...

  4. .NET基础拾遗(7)多线程开发基础1

    一.多线程编程的基本概念 1.1 操作系统层面的进程和线程 (1)进程 进程代表了操作系统上运行着的一个应用程序.进程拥有自己的程序块,拥有独占的资源和数据且可以被操作系统调度. But,即使是同一个 ...

  5. (转).NET基础拾遗(5)多线程开发基础

    https://www.cnblogs.com/edisonchou/p/4848131.html

  6. ios多线程开发基础

    多线程编程:下载数据时,开辟子线程,减少阻塞时间,和主线程并发运行,提升用户体验 1.Thread 1>新建Thread对象,带一selector方法,调用start方法,开启子线程 2> ...

  7. .NET基础拾遗(6)ADO.NET与数据库开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基 ...

  8. .NET基础拾遗(7)Web Service的开发与应用基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基 ...

  9. .NET基础拾遗(1)类型语法基础和内存管理基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基 ...

随机推荐

  1. 控制弹出div显示在鼠标附近的位置

    前一个页面: $("#txt_ocname").click(function () { art.dialog.open("/SelPosAll.aspx", { ...

  2. C#数组的使用

    //计算数组中最大值,最小值,平均值和总和 //类中main最先执行 static void Main(string[] args) { //声明一个数组,数组长度一定固定就不能更改了 , , , , ...

  3. JDBC使用sql语句

    JDBC---连接数据库 java与数据库连接需要驱动,这个驱动则是JDBC,连接的时候需要ip+端口号+dbname 还要用户名和密码 改java文件的编码方式--在项目名点右键属性----把编码方 ...

  4. DZ 3.2 URL 伪静态配置 教程

    原文转自:http://www.zccode.com/thread-682-1-1.html 教程说明: 1 首先需要下载URL重写工具,拷到服务器下面安装即可,这里配置IIS7(x64)伪静态. 工 ...

  5. HIBERNATE 入门小案例

    刚刚开始肯定好多人都会问什么是hibernate呢? 那么下面我们就来了解一下什么事hibernate吧! 首先,Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对 ...

  6. notes: the architecture of GDB

    1. gdb structure at the largest scale,GDB can be said to have two sides to it:1. The "symbol si ...

  7. 系统共享内存的修改(ORA-27102: out of memory)

    http://ccchencheng.blog.51cto.com/2419062/738188 http://blog.csdn.net/leshami/article/details/874602 ...

  8. 几种开源SIP协议栈对比OPAL,VOCAL,sipX,ReSIProcate,oSIP

    随着VoIP和NGN技术的发展,H.323时代即将过渡到SIP时代,在H.323的开源协议栈中,Openh323占统治地位,它把一个复杂而又先进 的H.323协议栈展现在普通程序员的眼前,为H.323 ...

  9. 关于NAT穿透的一些理解

    前些天在知乎回答了一个智能家居远程控制方面的问题,感觉自己对无公网IP地址环境下的穿透问题有些了解.昨天同事拿来一个网络摄像头,安装在ADSL路由器上网的环境下,可以远程查看视频,效果还挺不错,问我厂 ...

  10. CH Round #54 - Streaming #5 (NOIP模拟赛Day1)

    A.珠 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2354%20-%20Streaming%20%235%20(NOIP模拟赛Day1)/珠 题解:sb题, ...