VB.NET实现任务异步等待功能

来源:互联网 发布:染上你的颜色镜头数据 编辑:程序博客网 时间:2024/05/16 17:29
标题表达不太清楚,要实现的功能是这样的:
现在有类似如下的一个sub,里面依次调用了另外两个sub
    sub doWork()       work1()   '该sub过程中其实是让一个webbrowser控件载入指定网页       work2()   '分析网页中的数据并进行相应的操作    end sub


       那么问题来了,当work1执行后,webbrowser中的网页随即开始加载,但是由于页面内容涉及到了ajax等信息,因此在尝试使用其DocumentComplete事件判断页面是否加载完成纷纷失败告终后,决定想用指定等待时间的方式来解决,那么就需要让work2在执行之前等待一会儿,好,现在问题来了,我在work2调用之前加入thread.sleep(1000)的话,直接会导致整个form包括webbroswer一起都暂停了,ajax异步加载当然也暂停了,结果等于是白搭.想用多线程来实现吧,因为涉及到对主线程控件的调用,又是各种不行,查了许多资料,都说要用委托来实现,研究了一下下,好麻烦...这显然不符合用vb这么高端语言的风格嘛,不要麻烦,要简单粗暴有效,于是发现了原来vb.net中自带的backgroundworker就可以搞定这个任务!实现方法如下:
       从工具箱中拖一个backgroundworker到窗体里先,设置backgroundworker的dowork事件内容写成thread.sleep(1000),workcomplete事件里面的内容写成之前work2的内容,然后在dowork中执行完work1之后调用backgroundworker.RunWorkerAsync方法,最终实现的效果便是:
       work1先开始执行(页面尚未载入完毕),backgroundworker开始异步执行(其实也可以理解backgroundworker是个封装了的线程),因为backgroundworker执行的主体内容是thread.sleep,而其又是异步执行的,所以并不会导致form假死的现象,在thread.sleep完毕后又会触发workcomplete事件从而执行之前work2中想要执行的过程,妥妥的把问题解决了!虽然绕了一大圈,而且感觉这个方法也比较笨,不过确实实实在在的解决了之前的问题,如果还有其他更好的解决方法,还望赐教!
0 0