异步编程之使用匿名函数和Lambda表达式实现回调函数

      在进行异步编程的时候,如果我们使用的是在异步完成之后使用回调函数的方法,我们可能代码是这样写的。

View Code
1 public class AsyncDemo
2 {
3 public void AsyncRead()
4 {
5 string path = @"D:\临时备份\PersonalLearnDemo\AsyncApp\TextFile1.txt";
6 byte[]byteArray=new byte[100];
7 object[] context;
8 FileStream fileStream = new FileStream(path, FileMode.Open);
9 context = new object[] {path,fileStream,byteArray };
10 fileStream.BeginRead(byteArray, 0, 100, new AsyncCallback(CallBack),context);
11 }
12
13 public void CallBack(IAsyncResult result)
14 {
15 object []context = (object[])result.AsyncState;
16 FileStream fileStream=(FileStream)context[1];
17 fileStream.EndRead(result);
18 fileStream.Close();
19 byte[] byteArray =(byte[])context[2];
20 Console.WriteLine("对路径{0}的读取工作完成,内容:{1}",context[0],Encoding.UTF8.GetString(byteArray));
21
22 }

      我们通常是使用IAsyncResult的AsyncState成员来实现向回调函数传递参数(不知为什么不叫AsyncContext,AsyncState感觉挺别扭的),然后在回调函数中将参数类型转换,实现终止异步操作等。这样的实现有一点麻烦的是,需要维护主函数和回调函数调用的上下文,有没有一种更加简便的方法来实现这个?NET 2.0的匿名方法就可以实现这个。

View Code
1 public void AsyncRead2()
2 {
3 string path = @"D:\临时备份\PersonalLearnDemo\AsyncApp\TextFile1.txt";
4 byte[] byteArray = new byte[100];
5 FileStream fileStream = new FileStream(path, FileMode.Open);
6 //使用匿名函数进行异步调用,匿名方法,本来我们是需要用函数名加参数实现的,但是通过匿名方法我们只需要delegate(参数){方法体}
7 fileStream.BeginRead(byteArray, 0, 100, delegate(IAsyncResult result)
8 {
9 CallBack(path, byteArray, fileStream, result);
10 }, null);
11 }
12
13 public void CallBack(string path, byte[] byteArray, FileStream fileStream, IAsyncResult result)
14 {
15 fileStream.EndRead(result);
16 fileStream.Close();
17 Console.WriteLine("对路径{0}的读取工作完成,内容:{1}", path, Encoding.UTF8.GetString(byteArray));
18 }

    可以发现使用匿名方法可以自动保留上下文的特性,其实我们也可以实现将CallBack的方法体直接在匿名方法里面进行实现。只是上面的写法是为了增加可读性。

posted @ 2011-03-28 22:05  雁北飞  阅读(1093)  评论(0编辑  收藏  举报