如何让一个动作异步进行 vb.net先把这个“动作”定义为方法
Public Function MyAction(a As Integer) As Integer
' do something...
Return a+1
End Function
在类外面定义一个委托: Public Delegate Function
MyActionHandler(a As Integer) As Integer
在需要调用的地方:
Dim mah As MyActionHandler =
AddressOf MyAction
Dim iar As IAsyncResult = mah.BeginInvoke(1,Nothing,Nothing)
要结束并获得返回值:
Dim result As Integer = mah.EndInvoke(iar)
vb.net 中的异步委托机制 , 最好有相关的详细资料讲解,我是新手所谓的委托(Delegate)实际上就是和C/C++里面的函数指针差不多,只是增强了类型检查等其它健壮性方面的内容 。异步调用的回调函数有格式要求,所谓格式要求就是参数数量及类型顺序的要求,具体是什么样的你要看文档了 。一般.NETFramework里面都是AsyncCallBack 。
所谓异步编程,就是说你要求做某样事情,但是在完成这件事之前,我能接着做下一件事,而当这件事情完成之后 , 能够有一种机制通知我完成了 。相反,在完成之前一直等待,直到完成了才能进行下一步操作 , 叫做同步 。一般来说,我们平常写的程序都是“同步”,或者成为“顺序执行”更加贴切,而“异步”则可以说是“乱序执行”的 。
可以看到,同步的代码非常好写,因为我们可以预测执行的顺序和情况 。而异步就不是很好写了,因为无法得知完成的时候我正在做什么、做到什么程度 。过去写这些代码是比较麻烦的,实现的办法就是自己建立一个处理异步事物的线程 , 然后在这个线程和主线程之间建立联系 。而现在这个过程大部分已经被系统封装起来了,你只要调用BeginXXX,系统就会为你自动建立一个新的线程处理这个事情,当前线程不阻塞,可以马上进行下一项操作,于是就实现了“异步”了 。但是从前面我讲道的你就应该知道 , 开始异步操作并没有完事,还需要能够得知操作完成,并能够进行相应的处理 。于是你在调用BeginXXX的时候就需要传递一个回调函数,在.NET里是以委托的方式传递的 。回调函数的意思就是“回过头来调用你”,或者说A调用B并且传递函数C的地址,于是B在指定的情况下调用A指定的函数C 。现在就应该明白这个回调函数在BeginXXX中的作用就是,当你指定的事情做完之后将会调用这个回调函数 。
在这个回调函数里面,我们就可以进行一些后续的工作,例如接着进行性质相同的工作,或者相应的处理 。在这里,我们也许向知道刚才那件事情执行的情况和结果,这个时候我们就可以通过EndXXX来获得这些东西 。说到这里,结合上面说到的AsyncCallBack以及随便哪个BeginXXX,我们可能会对下列两个东西感到困惑:
IAsyncResult
【vb.net异步处理 vba 异步】stateObject
首先说IAsyncResult , 这个是一个接口,你在回调函数中通过参数获得的对象具体是什么类型的一般我们不需要关心,我们只需要依照这个接口的定义进行访问就可以了 。简单点说,这个接口规定了顺利完成异步操作所需信息的最小集合 。一般来说,我们需要通过这个参数(ar)来识别异步操作 。比如说,你在一瞬间发起一百个“从不同的网络连接获取数据”的异步请求,当某一个请求被完成的时候,如何判断是那个请求被完成呢?就是依靠回调函数的参数ar 。实际上你一般是不需要参与判断的 , 你只要将这个ar传递给EndXXX就可以了,EndXXX会根据这个ar自行判断的 。需要注意的是,这个ar就是你调用BeginXXX的时候的返回值,可以说是一个存根,如果你需要在完成操作前终止他,也可以通过将这个存根传递给EndXXX,EndXXX就会根据情况终止操作 。(IAsyncResult里面的IsCompleted提供了是否已经完成的判断,EndXXX就是根据这个值决定是否有必要终止 。当然 , 你不需要关心他 。)
推荐阅读
- 主机游戏经营,主机经营类游戏
- flutter微服务框架,flutter mvvm框架
- ppt怎么画直线,ppt怎么画直线倒角
- 直播人少话术,直播间人少怎么开场留人
- mysql怎么全表扫描 mysql全表扫描和索引
- 小区广告如何营销,小区广告运营方案
- 区块链举例,区块链最简单的解释
- chatgpt跟金融有什么关系,AIGC和ChatGPT什么关系
- php加载数据到对象 php加载js