我是一个初学者在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
。总之,这意味着您必须将Button
的Click
事件处理程序声明为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