[转]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 就可以简单有效的完成开发了
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 就可以简单有效的完成开发了
相关文章推荐
- C#基础学习 —— 异步编程篇 1
- C#基础学习 —— 异步编程篇 2
- C#基础学习 —— 异步编程篇
- C#基础学习 —— 异步编程篇
- [转]C#基础学习--异步编程篇
- C#基础学习--异步编程篇
- C#基础:通过一个实例来学习IFormattable接口,扩展方法
- C#2005 .NET3.0高级编程学习笔记———C#基础
- .Net学习笔记----2015-07-21(C#基础复习07,关键字、访问修饰符)
- 学习一下C#中常用集合和数组的区别,虽然很基础,但感觉很实用
- .net学习之C#基础提高 3.基础知识
- C#语言学习--基础部分(六) --异常处理
- C#基础学习之【7】事件的使用
- .net学习之C#基础提高 8.数据类型的自动转换
- C#学习笔记(二十一):使用文件基础
- C#学习笔记---基础入门(三)
- C#基础学习——流程控制语句
- 黑马程序员-C#基础学习-常用快捷键
- C#语言基础学习总结-1
- 自己用的C#基础学习笔记(二)——C#面向对象(2)