• 您的位置我爱Aspx >> VB.Net >> VB.NET中使用代表对方法异步调用
  • VB.NET中使用代表对方法异步调用

  • 作者:aspxer  来源:internet  日期:2007-5-20 14:01:06  关键字:.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)。

    我对这篇文章有话说?
  • 广告位招租,广告代号:content_468_15
  • 上一篇:在VB.NET中改变显示器的分辩率
    下一篇:.NET平台下Web树形结构程序设计