如何从异步任务中获取结果

8or*_*ris 1 vb.net asynchronous

我是 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
Run Code Online (Sandbox Code Playgroud)

以及我将启动此异步函数的模块

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
Run Code Online (Sandbox Code Playgroud)

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

jmc*_*ney 6

您可以在您发布的代码中看到它。该方法的第二行执行此操作。您使用Await运算符来等待 的完成Task

话虽如此,无论如何也得不到结果。如果你有一个同步,Sub那么它就会变成一个Function返回 a 的异步Task。在这两种情况下,该方法都没有实际价值。因此,等待这样的方法不会返回任何内容。如果您有一个Function返回类型为 的同步,那么它将成为返回一个 的T异步。等待会给你一个类型的结果。FunctionTask(Of T)T

如果你有这些方法:

Private Sub DoSomething()
    '...
End Sub

Private Function GetSomething() As SomeType
    '...
End Function
Run Code Online (Sandbox Code Playgroud)

那么你可以这样称呼它们:

DoSomething()

Dim someValue As SomeType = GetSomething()
Run Code Online (Sandbox Code Playgroud)

如果你有这些方法:

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

Private Async Function GetSomethingAsync() As Task(Of SomeType)
    '...
End Function
Run Code Online (Sandbox Code Playgroud)

那么你可以这样称呼它们:

Await DoSomethingAsync()

Dim someValue As SomeType = Await GetSomethingAsync()
Run Code Online (Sandbox Code Playgroud)

VB 实际上确实支持Async Sub,但您唯一应该使用它的是事件处理程序,必须声明它Sub,即您不能使用Function. Await此外,必须声明要在其中使用该运算符的任何方法Async。总之,这意味着您必须声明asClick的事件处理程序,然后您可以在其中等待异步方法: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
Run Code Online (Sandbox Code Playgroud)

至于你发布的代码,该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
Run Code Online (Sandbox Code Playgroud)

然后你会这样称呼它:

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
Run Code Online (Sandbox Code Playgroud)