同步方法和异步方法的区别
同步方法调用在程序继续执行之前需要等待同步方法执行完毕返回结
异步方法则在被调用之后立即返回以便程序在被调用方法完成其任务
异步编程概览
.NET Framework 允许您异步调用任何方法。
的 BeginInvoke 和 EndInvoke 方法。
BeginInvoke 方法用于启动异步调用。
BeginInvoke 立即返回,不等待异步调用完成。
BeginInvoke 返回 IasyncResult,可用于监视调用进度。
EndInvoke 方法用于检索异步调用结果。调用 BeginInvoke 后可随时调用 EndInvoke 方法;如果异步调用未完成,EndInvoke 将一直阻塞到
异步调用完成。EndInvoke 的参数包括您需要异步执行的方法的 out 和 ref 参数(在 Visual Basic 中为 <Out> ByRef 和 ByRef)以及由
BeginInvoke 返回的 IAsyncResult。
四种使用 BeginInvoke 和 EndInvoke 进行异步调用的常用方法。调用了 BeginInvoke 后,可以:
1.进行某些操作,然后调用 EndInvoke 一直阻塞到调用完成。
2.使用 IAsyncResult.AsyncWaitHandle 获取 WaitHandle,使用它的 WaitOne 方法将执行一直阻塞到发出 WaitHandle 信号,然后调用
EndInvoke。这里主要是主程序等待异步方法,
3.轮询由 BeginInvoke 返回的 IAsyncResult,IAsyncResult.
相同。
4.将用于回调方法的委托传递给 BeginInvoke。该方法在异步调用完成后在 ThreadPool 线程上执行,它可以调用 EndInvoke。
警告 始终在异步调用完成后调用 EndInvoke。
以上有不理解的稍后可以再理解。
例子
1)先来个简单的没有回调函数的异步方法例子
请再运行程序的时候,仔细看注释,对理解很有帮助。还有,
namespace ConsoleApplication1
{
class Class1
{
//声明委托
public delegate void
void Event1()
{
Console.WriteLine(
System.Threading.
Console.WriteLine(
}
// 同步方法
void Event2()
{
Console.WriteLine(
int i=1;
while(i<1000)
{
i=i+1;
Console.
}
Console.WriteLine(
}
[STAThread]
static void Main(strin
{
long start=0;
long end=0;
Class1 c = new
Console.WriteLine(
start=DateTime.
AsyncEventHandler
IAsyncResult ia =
//同步开始,
c.Event2();
//异步结束,若没有结束,
asy.EndInvoke(ia);
//都同步的情况。
//c.Event1();
//c.Event2();
end =DateTime.Now.
Console.WriteLine(
Console.ReadLine()
}
}
}
2)
using System.Net;
using System.Threading;
using System.Text;
using System.IO;
// RequestState 类用于通过
// 异步调用传递数据
public class RequestState
{
const int BUFFER_SIZE = 10
public StringBuilder
public HttpWebRequest
public Decoder
{
BufferRead = new byte[
RequestData
Request = null;
ResponseStream = null;
}
}
// ClientGetAsync 发出异步请求
class ClientGetAsync
{
public static
const int BUFFER_SIZE = 10
public static void Main(st
{
if (args.Length < 1)
{
showusage();
return;
}
// 从命令行获取 URI
Uri HttpSite = new
// 创建请求对象
HttpWebRequest wreq =
RequestState rs = new
rs.Request = wreq;
// 发出异步请求
IAsyncResult r = (
allDone.WaitOne();
}
public static void
Console.WriteLine("尝试获
Console.WriteLine(""r"
Console.WriteLine("Cli
Console.WriteLine("示例:
Console.WriteLine("Cli
}
private static void
// 从异步结果获取
RequestState rs = (
HttpWebRequest req =
HttpWebResponse resp =
// 响应流开始读取数据了
Stream ResponseStream
// 该读取操作也使用异步完成,所以我们
// 将要以 RequestState
rs.ResponseStream =
IAsyncResult iarRead =
}
private static void
// 从 asyncresult 获取
RequestState rs = (
Stream responseStream
// 此时 rs.BufferRead
int read =
{
// 准备 Char 数组缓冲区,
Char[] charBuffer
// 将字节流转换为 Char
int len = rs.
String str = new
// 将最近读取的数据追加到
rs.RequestData.
// responseStream.
IAsyncResult ar =
}
else
{
if (rs.
{
// 所有数据都已被读取,
string
strContent
Console.
}
// 关闭响应流
responseStream.
allDone.Set();
}
return;
}
}
在这里有回调函数,且异步回调中又有异步操作。
首先是异步获得ResponseStream,
这个程序非常经典。从中可以学到很多东西的。我们来共同探讨。
总结
上面说过,.net framework 可以异步调用任何方法。所以异步用处广泛。
在.net framework 类库中也有很多异步调用的方法。