.NET基础拾遗(7)多线程开发基础3
一.如何使用异步模式?
异步模式是在处理流类型时经常采用的一种方式,其应用的领域相当广阔,包括读写文件、网络传输、读写数据库,甚至可以采用异步模式来做任何计算工作。相对于手动编写线程代码,异步模式是一个高效的编程模式。
(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的更多相关文章
- .NET基础拾遗(5)多线程开发基础
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
- .NET基础拾遗(7)多线程开发基础4
一.多线程编程中的线程同步 1.C#中的lock关键字 lock关键字可能是我们在遇到线程同步的需求时最常用的方式,但lock只是一个语法糖,为什么这么说呢,下面慢慢道来. (1)lock的等效代码其 ...
- .NET基础拾遗(7)多线程开发基础2
二..NET中的多线程编程 2.1 如何在.NET程序中手动控制多个线程? 最直接且灵活性最大的,莫过于主动创建.运行.结束所有线程. (1)第一个多线程程序 .NET提供了非常直接的控制线程类型的类 ...
- .NET基础拾遗(7)多线程开发基础1
一.多线程编程的基本概念 1.1 操作系统层面的进程和线程 (1)进程 进程代表了操作系统上运行着的一个应用程序.进程拥有自己的程序块,拥有独占的资源和数据且可以被操作系统调度. But,即使是同一个 ...
- (转).NET基础拾遗(5)多线程开发基础
https://www.cnblogs.com/edisonchou/p/4848131.html
- ios多线程开发基础
多线程编程:下载数据时,开辟子线程,减少阻塞时间,和主线程并发运行,提升用户体验 1.Thread 1>新建Thread对象,带一selector方法,调用start方法,开启子线程 2> ...
- .NET基础拾遗(6)ADO.NET与数据库开发基础
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基 ...
- .NET基础拾遗(7)Web Service的开发与应用基础
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基 ...
- .NET基础拾遗(1)类型语法基础和内存管理基础
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基 ...
随机推荐
- PHP Cookies
PHP Cookies cookie 常用于识别用户. Cookie 是什么? cookie 常用于识别用户.cookie 是一种服务器留在用户计算机上的小文件.每当同一台计算机通过浏览器请求页面时, ...
- Javascript 常用函数【1】
1:基础知识 1 创建脚本块 1: <script language=”JavaScript”> 2: JavaScript code goes here 3: </script&g ...
- php 通过ip获取地理位置
<?php header('Content-Type:text/html;Charset=utf-8'); function GetIp(){ $realip = ''; $unknown = ...
- assert实现
测试网站在国内国外的访问速度 关于C的右左法则 assert宏的实现(一道笔试题) 2010-11-09 13:05:48| 分类: c | 标签: |举报 |字号大中小 订阅 asser ...
- JavaScript 阻止事件冒泡的实现方法
JavaScript 阻止事件冒泡,无使用其它插件来辅助,原生JS代码,考虑到浏览器的兼容性问题,这里对IE/火狐.Operating以及Chrome都有针对性的判断,代码如下: function c ...
- oracle创建主键序列和在ibatis中应用
oracle创建主键序列 oracle主键序列的查询和ibitas中应用
- 深入浅出Java 重定向和请求转发的区别
深入浅出Java 重定向和请求转发的区别 <span style="font-family:FangSong_GB2312;font-size:18px;">impor ...
- xml约束之schema
使用名称空间引入Schema : 通常需要在Xml文档中的根结点中使用schemaLocation属性来指定. <itcast:书架 xmlns:itcast="http://www. ...
- Oracle基本分组查询group by的使用
(1)查询各个工作岗位的总人数 (2)查询各个工作岗位的总工资 (3)查询各个工作岗位的平均工资
- window.onscroll
http://www.w3help.org/zh-cn/causes/SD9013 1.各浏览器对 document.document.body.document.documentElement 对象 ...