我爱Aspx >> VB.Net >> VB.NET中使用代表对方法异步调用Dim ar1, ar2 as System.IASyncResult
Dim rt1, rt2 as String()
ar1 = delegate1.BeginInvoke("class90",Nothing, Nothing)
ar2 = delegate2.BeginInvoke("class94",Nothing, Nothing)
rt1 = delegate1.EndInvoke(ar1)
rt2 = delegate2.EndInvoke(ar2)
在这个例子中,delegate1的调用和delegate2的调用完成顺序可能会有多种情况。比如delegate2的调用后发先至,那么EndInvoke的使用顺序是不是很重要呢?事实上,你可以忽略这个问题,CLR会保证在两个异步调用都结束后,你才可以进行下面的操作。至于它是怎么实现的,你可以不去管它。
事实上,EndInvoke是非常重要的。如果你使用了BeginInvoke,那你最好使用EndInvoke。因为你如果不使用EndInvoke,那么后台调用的异常就没有机会被捕捉到。另外,使用了EndInvoke可以让CLR释放异步调用中所使用的资源,否则你的应用程序就可能出现资源泄漏(Resource Leak)。
到这里,情况已经比较清楚了。使用Delegate可以让后台线程代替当前线程去完成费时的操作,从而使当前线程不被“阻挡”,可以马上进行其它的工作。但是,如果当前线程通过EndInvoke来得到异步调用的结果,它又很可能被“阻挡”。看起来有点“拆了东墙补西墙”的样子,好像我们没有得到什么好处。打个比方来说吧,你要到复印室去复印一批材料,这个工作要费时一个多小时。同步调用就意味着你自己亲自去复印,一个多小时候再返回办公室作其它工作。异步调用意味着你可以把复印材料交到复印室,那里有专人负责复印。你放下材料后就可以回到办公室去干其它工作了。但问题是,你要不停的查看材料是否复印好了,一旦发现复印完毕后,就马上取回作相应的操作。你不停的查看(调用代表的IsComplete方法)或者是“干等”(调用代表的EndInvoke方法)实际上还是把你“捆住”了,你没有能腾出手来干其它的事。能不能我把材料放到复印室就不管了,等复印好后他们给我把材料送回来?。答案是可以的,那就是利用回调函数(Callback Function)。
【我对这篇文章有话说?】
.NET平台下Web树形结构程序设计[05-20]
Visual Basic.NET带来的新方法(一..[05-20]
Visual Basic.NET带来的新方法(二..[05-20]
Visual Basic.NET 中的语言新变化[05-20]
介绍VB.NET的线程(英文)[05-20]
一步一步安装VB.Net(图片较多,..[05-20]
走近VB.Net(一),VB中的族,类,..[05-20]
VB.Net中文教程(1) 类别与封装性[05-20]
VB.Net中文教程(2) Composite样式[05-20]
VB.Net中文教程(3) 继承与封装性[05-20]
.NET平台下Web树形结构程序设计[05-20]
Visual Basic.NET带来的新方法(一..[05-20]
Visual Basic.NET带来的新方法(二..[05-20]
Visual Basic.NET 中的语言新变化[05-20]
介绍VB.NET的线程(英文)[05-20]
一步一步安装VB.Net(图片较多,..[05-20]
走近VB.Net(一),VB中的族,类,..[05-20]
VB.Net中文教程(1) 类别与封装性[05-20]
VB.Net中文教程(2) Composite样式[05-20]
VB.Net中文教程(3) 继承与封装性[05-20]