1、-同步方法和异步方法的区别同步方法调用在程序继续执行之前需要等待同步方法执行完毕返回结果异步方法则在被调用之后立即返回以便程序在被调用方法完成其任务的同时执行其它操作异步编程概览.NET Framework 允许您异步调用任何方法。定义与您需要调用的方法具有相同签名的委托;公共语言运行库将自动为该委托定义具有适当签名的 BeginInvoke 和 EndInvoke 方法。BeginInvoke 方法用于启动异步调用。它与您需要异步执行的方法具有相同的参数,只不过还有两个额外的参数(将在稍后描述) 。BeginInvoke 立即返回,不等待异步调用完成。BeginInvoke 返回 Iasyn
2、cResult,可用于监视调用进度。EndInvoke 方法用于检索异步调用结果。调用 BeginInvoke 后可随时调用 EndInvoke 方法;如果异步调用未完成,EndInvoke 将一直阻塞到异步调用完成。EndInvoke 的参数包括您需要异步执行的方法的 out 和 ref 参数(在 Visual Basic 中为 ByRef 和 ByRef)以及由BeginInvoke 返回的 IAsyncResult。四种使用 BeginInvoke 和 EndInvoke 进行异步调用的常用方法。调用了 BeginInvoke 后,可以:1.进行某些操作,然后调用 EndInvoke 一
3、直阻塞到调用完成。2.使用 IAsyncResult.AsyncWaitHandle 获取 WaitHandle,使用它的 WaitOne 方法将执行一直阻塞到发出 WaitHandle 信号,然后调用EndInvoke。这里主要是主程序等待异步方法,等待异步方法的结果。3.轮询由 BeginInvoke 返回的 IAsyncResult,IAsyncResult.IsCompeted 确定异步调用何时完成,然后调用 EndInvoke。此处理个人认为与相同。4.将用于回调方法的委托传递给 BeginInvoke。该方法在异步调用完成后在 ThreadPool 线程上执行,它可以调用 EndI
4、nvoke。这是在强制装换回调函数里面 IAsyncResult.AsyncState(BeginInvoke 方法的最后一个参数)成委托,然后用委托执行 EndInvoke。警告 始终在异步调用完成后调用 EndInvoke。以上有不理解的稍后可以再理解。例子1)先来个简单的没有回调函数的异步方法例子请再运行程序的时候,仔细看注释,对理解很有帮助。还有,若将注释的中的两个方法都同步,你会发现异步运行的速度优越性。using System;namespace ConsoleApplication1class Class1/声明委托public delegate void AsyncEventH
5、andler();/异步方法void Event1()Console.WriteLine(“Event1 Start“);System.Threading.Thread.Sleep(4000);Console.WriteLine(“Event1 End“);/ 同步方法void Event2()Console.WriteLine(“Event2 Start“);int i=1;while(i 0)/ 准备 Char 数组缓冲区,用于向 Unicode 转换Char charBuffer = new CharBUFFER_SIZE;/ 将字节流转换为 Char 数组,然后转换为字符串/ len
6、显示多少字符被转换为 Unicodeint len = rs.StreamDecode.GetChars(rs.BufferRead, 0, read, charBuffer, 0);String str = new String(charBuffer, 0, len);/ 将最近读取的数据追加到 RequestData stringbuilder 对象中,/ 该对象包含在 RequestState 中rs.RequestData.Append(str);/ 现在发出另一个异步调用,读取更多的数据/ 请注意,将不断调用此过程,直到/ responseStream.EndRead 返回 -1IA
7、syncResult ar = responseStream.BeginRead(rs.BufferRead, 0, BUFFER_SIZE, new AsyncCallback(ReadCallBack), rs);elseif (rs.RequestData.Length 1)/ 所有数据都已被读取,因此将其显示到控制台string strContent;strContent = rs.RequestData.ToString();Console.WriteLine(strContent);/ 关闭响应流responseStream.Close();/ 设置 ManualResetEven
8、t,以便主线程可以退出allDone.Set();return;在这里有回调函数,且异步回调中又有异步操作。首先是异步获得 ResponseStream,然后异步读取数据。这个程序非常经典。从中可以学到很多东西的。我们来共同探讨。总结上面说过,.net framework 可以异步调用任何方法。所以异步用处广泛。在.net framework 类库中也有很多异步调用的方法。一般都是已 Begin 开头 End 结尾构成一对,异步委托方法,外加两个回调函数和 AsyncState 参数,组成异步操作的宏观体现。所以要做异步编程,不要忘了委托 delegate、Begin ,End,AsyncCallBack 委托,AsyncState 实例 (在回调函数中通过 IAsyncResult.AsyncState 来强制转换),IAsycResult( 监控异步) ,就足以理解异步真谛资料引用:http:/