如何解决如何让 WebClient 的 DownloadString 异步执行?
我创建了一个简单的 hello world 程序来从网络下载数据。
Private Sub cmdsurf_Click(sender As Object,e As EventArgs) Handles cmdsurf.Click
Dim wb As New System.Net.WebClient
Dim uri1 = New Uri(TextBox1.Text)
Dim str = wb.DownloadString(uri1)
TextBox2.Text = str
End Sub
很简单吧。我使用 WebClient 对象同步下载字符串,然后在 TextBox 中显示结果。
现在,我想异步执行此操作。
基本上,在我下载 URI 后,我会做其他事情。
然后下载完成后,我正在做它应该做的。
所以我做到了
Private Sub Button2_Click(sender As Object,e As EventArgs) Handles Button2.Click
Dim wb As New System.Net.WebClient
Dim uri1 = New Uri(TextBox1.Text)
wb.DownloadStringAsync(uri1)
TextBox2.Text = ""
End Sub
结果 DownloadStringAsync(uri1)
是一个 Sub,所以它不返回任何东西。
那么,那么,TextBox2 中应该显示什么呢?我错过了什么?
更新:我意识到我应该使用 DownloadStringAsyncTask()
。
所以我这样做了:
Private Async Sub Button2_Click(sender As Object,e As EventArgs) Handles Button2.Click
Await downloadStringAndAssignText()
TextBox2.Text = "I am downloading this. This text will change once the download is finished"
End Sub
Private Async Function downloadStringAndAssignText() As Task
Dim wb As New System.Net.WebClient
Dim uri1 = New Uri(TextBox1.Text)
Dim str = Await wb.DownloadStringTaskAsync(uri1)
TextBox2.Text = str
End Function
这几乎是正确的。
问题是我想正确地做到这一点
TextBox2.Text = "I am downloading this. This text will change once..."
在 wb.DownloadStringTaskAsync(uri1)
完成之前被调用。
我也不想警告。那么我到底应该怎么做呢?
解决方法
您可以在调用下载字符串的异步方法之前设置 TextBox 的文本。当调用 Await DownloadStringAndAssignText()
时,控制将返回到调用线程(UI 线程),因此 TextBox.Text
被设置并显示。
当 async 方法返回时,您可以将返回的字符串值分配给同一个 TextBox。
您的方法应该返回一个值,即它下载的字符串,而不是将值分配给不属于此方法的 UI 元素(它的职责是下载字符串):这里的返回类型设置为 Task(Of String)
.
可以直接将异步方法的返回值赋给同一个 TextBox.Text 属性。
应该使用 Using
语句声明 WebClient 对象,以便在方法完成时处理它。
你可以直接返回WebClient.DownloadStringTaskAsync()
的结果,因为这个方法返回的是一个字符串,与你的方法的返回类型相同。
Imports System.Net
Private Async Sub Button2_Click(sender As Object,e As EventArgs) Handles Button2.Click
TextBox2.Text = "I am downloading..."
TextBox2.Text = Await DownloadStringAndAssignText(TextBox1.Text)
End Sub
Private Async Function DownloadStringAndAssignText(url As String) As Task(Of String)
Using wb As New WebClient()
Return Await wb.DownloadStringTaskAsync(New Uri(url))
End Using
End Function
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。