Invoke和BeginInvoke 方法使用说明

public function delayedresponse(byval waitperiod as integer) _
as string
dim results() as object _
= me.invoke("delayedresponse", _
new object() {waitperiod})
return ctype(results(0),string)
end function

invoke 方法使用两个参数:一个函式名称和一个保留要传递至函式的参数之对象数组。invoke 方法传回对象数组,在本范例中,它只包含一个元素—从我们的函式传回的字符串。这是发出同步呼叫的机制,这些呼叫要等到接收响应之后才传回。
soaphttpclientprotocol 类别也有一个叫作 begininvoke 的方法,它是用来启动异步要求的机制。[加入 web 参考] 所建立的类别也会建立一个叫作 begindelayedresponse 的公用函式来配合我们之前看过的区块式 delayedresponse 函式。begindelayedresponse 的程序代码显示如下。
public function begindelayedresponse( _
byval waitperiod as integer, _
byval callback as system.asynccallback, _
byval asyncstate as object) as system.iasyncresult
return me.begininvoke("delayedresponse", _
new object() {waitperiod}, _
callback, _
asyncstate)
end function
begindelayedresponse 使用 begininvoke 方法,它在许多方面类似我们之前使用过的 invoke 方法。前两个参数与 invoke 方法使用的参数相同。不过,begininvoke 还有两个额外参数,而且它不再传回对象数组。不过,其主要差异是 begininvoke 会立刻传回,而不等待 web 服务呼叫完成。
begininvoke 的两个额外参数的第一个叫作 system.asynccallback。这就是所谓的委派,基本上它是一个用来宣告 managed 程序代码中的函式指标的机制。在本范例中,一旦 web 方法呼叫完成且我们收到回应,则会呼叫此函式。
begininvoke 的最后一个参数就叫作 asyncstate,它被宣告为对象类型。这可以是您要用来追踪此要求的任何项目。您可以对许多不同的异步要求使用相同的回呼函式,以便区别某个呼叫的响应与另一个呼叫的响应,您可以把关于该呼叫的信息放在 asyncstate 参数中,它将供您的回呼函式使用。
关于 begininvoke 还有一点不同,即它传回的内容。很显然,如果呼叫未完成,则它不能传回响应数据至 web 方法。它传回的是 system.iasyncresult 界面指针。您可以使用 iasyncresult 接口指针取得关于该要求的信息。iasyncresult 显示四个公用属性,如下所示:
属性 说明
asyncstate 这是传入 begininvoke 方法的第四个参数的数据。
asyncwaithandle 这是 waithandle 对象,可用来封锁执行绪目前的执行,直到有一或多个 web 服务呼叫完成为止。
completedsynchronously 此参数不适用于 web 服务呼叫。iasyncresult 接口是用于一些 i/o 作业,此属性可让您知道异步 i/o 作业要求是否太快完成,它甚至在 begin 函式传回之前完成。
iscompleted 这是一个旗标,您可用它来判断呼叫是否完成。
iasyncresult 指针是最后可让您和系统分辨不同的异步完成的指针。它也提供您不同选项来判断呼叫何时完成。我们看看如何使用这些选项。
一如前述,[加入 web 参考] 选项会为使用 begininvoke 的服务所提供的每一个 web 方法建立一个函式。在我们的范例中,所产生的函式叫作 begindelayedresponse,它是 begininvoke 方法的一个极轻巧的包装函式,它显示 web 呼叫方法的参数以及 begininvoke 提供的 callback 和 asyncstate 参数。接下来,我们要看看用来提出异步要求和判断何时完成要求的三个选项。
发出异步呼叫的三个选项
每一个应用程序都不一样,因此,发出异步呼叫的案例对某些应用程序可能有效,但不一定对其他应用程序有效。在提供发出异步呼叫的方式上,.net framework 有很大的弹性。您可以轮询看看何时完成要求、封锁 waithandle 或等待回呼函式。现在我们个别来看一看这些方式。
轮询完成状态
从 begindelayedresponse 函式传回的 iasyncresult 接口有一个 iscompleted 属性,可检查此属性来判断是否完成要求。您可以轮询此属性,直到它传回 true 值为止。示范此方式的简短程序代码如下所示:
轮询会束缚处理器的程序代码
dim proxy as new localhost.service1()
dim result as iasyncresult
result = proxy.begindelayedresponse(2000, _
nothing, _
nothing)
while (result.iscompleted = false)
执行一些处理
...
wend
dim response as string
response = proxy.enddelayedresponse(result)
轮询完成状态是一个很直接的方式,但它的确有一些缺点。此程序代码显示如何对 begindelayedresponse 发出起始呼叫,它传递数字 2000 作为要传至 web 方法的参数,然后将回呼和 asyncstate 设定为 nothing。然后我们有一个 while 循环来轮询 iscompleted 属性,直到它为 true 为止。当呼叫完成且 iscompleted 属性设定为 true 时,我们会脱离 while 循环,然后我们使用 [加入 web 参考] 产生的类别中的另一个函式叫作 enddelayedresponse,来取得回应。enddelayedresponse 是 soaphttpclientprotocol 类别的 endinvoke 方法的包装函式,而且是从 web 方法呼叫取得传回的数据的机制。当您知道 web 服务呼叫完成时即可使用;它传回的信息与 invoke 方法传回给区块式呼叫的信息一样。在所有三个异步案例中,我们会使用 enddelayedresponse 方法取得 web 服务呼叫的结果。请注意,如果在完成要求之前呼叫 enddelayedresponse,则它直接封锁,直到要求真正完成为止。
在使用轮询判断呼叫是否完成时,您需要注意的其中一个问题是,您一不小心就会消耗掉很多的机器 cpu 周期。例如,如果 while 循环内没有程序代码,则执行此程序代码的执行绪可占据您机器上的大部份资源。事实上,它会吃掉很多处理时间,使得要传送 web 服务要求和接收响应的基础程序代码因而延迟。因此,使用轮询时要小心。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值