但是这样的话,就会强制关闭所有正在执行的线程,所以在关闭的时候要对线程工作的结
果保存。
经常看到名为 BeginXXX 和 EndXXX 的方法,他们是做什么用
的
这是.net 的一个异步方法名称规范
.Net 在设计的时候为异步编程设计了一个异步编程模型(APM),这个模型不
仅是使用.NET 的开发人员使用,.Net 内部也频繁用到,比如所有的 Stream
就有 BeginRead,EndRead,Socket,WebRequet,SqlCommand 都运用
到了这个模式,一般来讲,调用 BegionXXX 的时候,一般会启动一个异步过
程去执行一个操作,EndEnvoke 可以接收这个异步操作的返回,当然如果异
步操作在 EndEnvoke 调用的时候还没有执行完成,EndInvoke 会一直等待异
步操作完成或者超时
.Net 的异步编程模型(APM)一般包含
BeginXXX,EndXXX,IAsyncResult 这三个元素,BeginXXX 方法都要返回
一个 IAsyncResult,而 EndXXX 都需要接收一个 IAsyncResult 作为参数,
他们的函数签名模式如下
IAsyncResult BeginXXX(...);
<返回类型> EndXXX(IAsyncResult ar);
BeginXXX 和 EndXXX 中的 XXX,一般都对应一个同步的方法,比如
FileStream 的 Read 方法是一个同步方法,相应的 BeginRead(),
EndRead()就是他的异步版本,HttpRequest 有 GetResponse 来同步接收
一个响应,也提供了 BeginGetResponse 和 EndGetResponse 这个异步版
本,而 IAsynResult 是二者联系的纽带,只有把 BeginXXX 所返回的
IAsyncResult 传给对 应的 EndXXX,EndXXX 才知道需要去接收哪个
BeginXXX 发起的异步操作的返回值。
这个模式在实际使用时稍显繁琐,虽然原则上 我们可以随时调用 EndInvoke 来
获得返回值,并且可以同步多个线程,但是大多数情况下当我们不需要同步很多
线程的时候使用回调是更好的选择,在这种 情况下三个元素中的 IAsynResult
就显得多余,我们一不需要用其中的线程完结标志来判断线程是否成功完成(回
调的时候线程应该已经完成了),二不 需要他来传递数据,因为数据可以写在任何
变量里,并且回调时应该已经填充,所以可以看到微软在新的.Net Framework
中已经加强了对回调事件的支持,这总模型下,典型的回调程序应该这样写