vb.net - 如何从异步任务中获取结果
问题描述
我是在 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
我的问题:结果是一项任务。我如何获得描述的价值?
解决方案
您可以在发布的代码中看到它。该方法的第二行就是这样做的。您使用Await
运算符等待Task
.
也就是说,无论如何都没有结果。如果你有一个同步Sub
的,那么它就变成了一个异步的Function
,它返回一个Task
. 在这两种情况下,都没有真正的价值可以摆脱该方法。因此,等待这样的方法不会返回任何东西。如果你有Function
一个返回类型为T
then 的同步,那将变成一个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
事件处理程序,然后您可以在其中等待异步方法:Button
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
推荐阅读
- python - 访问 API 时在 Python 中获取请求错误 404
- php - 选中的复选框不会覆盖具有相同名称的隐藏输入
- python - Python解析网页链接计数器
- javascript - babel 7 和函数绑定运算符
- android - 通过蓝牙耳机 VoIP 接听电话
- ios - 如何在 iOS 上的 Swift 中创建类似于 Snapchat 的自定义过渡动画
- javascript - 如何将我的聊天消息设为私密?
- node.js - Winston 不显示错误详细信息
- c++ - 如何在 SFML 2.5.0 中的两个 RectangleShapes 之间进行碰撞?(C++)
- c# - 文本框行上的“清除”按钮仅出现一次