微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何让 WebClient 的 DownloadString 异步执行?

如何解决如何让 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 举报,一经查实,本站将立刻删除。