首页 > 解决方案 > 如何从异步任务中获取结果

问题描述

我是在 VB.NET 中使用异步的初学者。我阅读了在线帮助,但有些事情并不清楚。我尝试使用tweetinvi

我懂了:

Namespace tweet_invi
    Class twitter_call
        Public Shared Async Function twitter_get_user_info_from_id(id As Long) As Task

            Dim userClient = New TwitterClient(ConfigurationManager.AppSettings("consumerKey"), ConfigurationManager.AppSettings("consumerSecret"), ConfigurationManager.AppSettings("accessToken"), ConfigurationManager.AppSettings("accessTokenSecret"))

            Dim tweetinviUser = Await userClient.Users.GetUserAsync(id)

            Dim description As String = tweetinviUser.Description
        End Function
    End Class
End Namespace

以及我将启动此异步功能的模块

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click

   Dim toto As Long = 1311275527223812096
   Dim result = tweet_invi.twitter_call.twitter_get_user_info_from_id(toto)

End Sub

我的问题:结果是一项任务。我如何获得描述的价值?

标签: vb.netasynchronous

解决方案


您可以在发布的代码中看到它。该方法的第二行就是这样做的。您使用Await运算符等待Task.

也就是说,无论如何都没有结果。如果你有一个同步Sub的,那么它就变成了一个异步的Function,它返回一个Task. 在这两种情况下,都没有真正的价值可以摆脱该方法。因此,等待这样的方法不会返回任何东西。如果你有Function一个返回类型为Tthen 的同步,那将变成一个Function返回 a的异步Task(Of T)。等待给你一个 type 的结果T

如果你有这些方法:

Private Sub DoSomething()
    '...
End Sub

Private Function GetSomething() As SomeType
    '...
End Function

那么你会这样称呼他们:

DoSomething()

Dim someValue As SomeType = GetSomething()

如果你有这些方法:

Private Async Function DoSomethingAsync() As Task
    '...
End Function

Private Async Function GetSomethingAsync() As Task(Of SomeType)
    '...
End Function

那么你会这样称呼他们:

Await DoSomethingAsync()

Dim someValue As SomeType = Await GetSomethingAsync()

VB 实际上确实支持Async Sub,但唯一一次你应该使用它是事件处理程序,它必须被声明Sub,即你不能用Function. Await此外,必须声明要在其中使用运算符的任何方法Async。总之,这意味着您必须声明as的Click事件处理程序,然后您可以在其中等待异步方法:ButtonAsync Sub

Private Async Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
   Dim toto As Long = 1311275527223812096

   Await tweet_invi.twitter_call.twitter_get_user_info_from_id(toto)
End Sub

关于您发布的代码,该twitter_get_user_info_from_id方法是无用的。它声明并设置了一些局部变量,但对它获取的数据不做任何事情。我怀疑该方法应该是这样的:

Namespace tweet_invi
    Class twitter_call
        Public Shared Async Function twitter_get_user_info_from_id(id As Long) As Task(Of String)
            Dim userClient = New TwitterClient(ConfigurationManager.AppSettings("consumerKey"), ConfigurationManager.AppSettings("consumerSecret"), ConfigurationManager.AppSettings("accessToken"), ConfigurationManager.AppSettings("accessTokenSecret"))
            Dim tweetinviUser = Await userClient.Users.GetUserAsync(id)
            Dim description As String = tweetinviUser.Description

            Return description
        End Function
    End Class
End Namespace

然后你会这样称呼它:

Private Async Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
   Dim toto As Long = 1311275527223812096
   Dim userInfo = Await tweet_invi.twitter_call.twitter_get_user_info_from_id(toto)

   '...
End Sub

推荐阅读