You need to enable JavaScript to run this app. 如何访问await所得对象的属性及多值?VB.NET开发问题
优惠活动
大模型
产品
解决方案
定价
更多

如何访问await所得对象的属性及多值?VB.NET开发问题

问题根源
  1. 你的异步方法x返回类型声明为Task(Of Object),导致await后得到的变量类型是Object,编译器无法识别它实际是ReturnValues类型,因此无法直接访问属性。
  2. 如果你调试时看到结果对象自带Result属性,说明你没有正确await方法,拿到的是原始的Task(Of Object)对象——Task(Of T)类本身就内置Result属性,用于存储实际的业务返回值。
  3. 你尝试将结果转成数组是完全错误的方向,你返回的是自定义类实例,不是数组集合,无法通过索引取值。
解决方案

方案一(最优):修正异步方法返回类型

直接将方法的返回类型从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 03:57:00