如何访问await所得对象的属性及多值?VB.NET开发问题
问题根源
- 你的异步方法
x返回类型声明为Task(Of Object),导致await后得到的变量类型是Object,编译器无法识别它实际是ReturnValues类型,因此无法直接访问属性。 - 如果你调试时看到结果对象自带
Result属性,说明你没有正确await方法,拿到的是原始的Task(Of Object)对象——Task(Of T)类本身就内置Result属性,用于存储实际的业务返回值。 - 你尝试将结果转成数组是完全错误的方向,你返回的是自定义类实例,不是数组集合,无法通过索引取值。
解决方案
方案一(最优):修正异步方法返回类型
直接将方法的返回类型从Task(Of Object)改为Task(Of ReturnValues),让编译器明确返回类型:
' 原错误声明: ' Public Shared Async Function x(ByVal sUserID As String) As Threading.Tasks.Task(Of Object) ' 修正为: Public Shared Async Function x(ByVal sUserID As String) As Threading.Tasks.Task(Of ReturnValues)
之后在调用方正确await,即可直接访问属性:
' 正确调用,指定变量类型为ReturnValues Dim result As ReturnValues = Await x(sUserID) ' 直接访问属性即可 Dim sResult = result.result Dim sResultBank = result.resultBank Dim sResultNameAddressMatch = result.resultAddressMatch
方案二(兼容旧代码):手动强转类型
如果因为兼容问题必须保留Task(Of Object)的返回类型,await后手动将Object转成ReturnValues即可:
Dim objResult As Object = Await x(sUserID) Dim result As ReturnValues = CType(objResult, ReturnValues) ' 后续访问属性逻辑和方案一一致
额外代码隐患修正
你现在把ReturnValues实例results定义在异步方法x外部,且x是共享(Shared)方法,这意味着该实例是全局共享的,多个并发调用x时会出现属性被互相覆盖的问题。建议将实例创建移到方法内部,每次调用生成独立的实例:
Public Shared Async Function x(ByVal sUserID As String) As Threading.Tasks.Task(Of ReturnValues) ' 每次调用生成独立实例,避免并发冲突 Dim results As New ReturnValues() results.result = data.data.attributes.result results.resultBank = data.data.attributes.bank_account_match results.resultAddressMatch = data.data.attributes.name_and_address_match Return results End Function
注意:不要直接通过Task对象的
Result属性取值,该操作会阻塞当前线程等待异步任务完成,仅在非异步上下文中无法使用await时才建议使用。
内容的提问来源于stack exchange,提问作者A1raa
相关产品推荐
相关产品推荐

