如何从异步任务获取结果



我是一个初学者在VB.NET中使用异步。我在网上看了帮助,但有些事情不太清楚。我尝试使用tweetinvilibrary

I got this:

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

和启动async函数的模块

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

我的问题是:result是一个任务。我如何获得描述的值?

您可以在您发布的代码中看到它。该方法的第二行实现了这一点。您使用Await操作符来等待Task的完成。

也就是说,无论如何也得不到结果。如果你有一个同步的Sub,那么它就变成了一个返回Task的异步Function。在这两种情况下,都没有实际的值可以从方法中获得。因此,等待这样的方法不会返回任何东西。如果您有一个返回类型为T的同步Function,那么它将变成一个返回Task(Of T)的异步Function。等待得到类型为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。总之,这意味着您必须将ButtonClick事件处理程序声明为Async 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

最新更新