从网站下载字符串时停止窗体冻结

时间:2013-08-06 01:23:17

标签: .net vb.net freeze webclient-download

在我的应用程序中,我有一个Web客户端,应该从网站下载字符串。它下载了相当多的文本,大约20行左右。但是,当我下载文本时,GUI会在下载时冻结,然后在完成下载后恢复。我该如何防止这种情况?

我使用的是Visual Basic 2010,.NET 4.0,Windows窗体和Windows 7 x64。

3 个答案:

答案 0 :(得分:1)

您可以将Task Parallel Library用于此

Task.Factory.StartNew(() =>
    {
        using (var wc = new WebClient())
        {
            return wc.DownloadString("http://www.google.com");
        }
    })
.ContinueWith((t,_)=>
    {
            textBox1.Text = t.Result;
    }, 
    null,
    TaskScheduler.FromCurrentSynchronizationContext());

PS:虽然您可以将此模板用于任何没有异步版本的方法,但WebClient.DownloadString确实有一个,所以我会选择Karl Anderson的答案

答案 1 :(得分:0)

在工作线程中执行时间密集型任务,而不是在GUI线程上执行。这样可以防止事件循环冻结。

答案 2 :(得分:0)

另一个替代方法是使用DownloadStringAsync,这将触发来自UI线程的请求,但它不会阻塞线程,因为它是异步请求。以下是使用DownloadStringAsync

的示例
Public Class Form1
    Private Sub AlertStringDownloaded(ByVal sender As Object, ByVal e As DownloadStringCompletedEventArgs)
        '  Did the request go as planned (no cancellation or error)?
        If e.Cancelled = False AndAlso e.Error Is Nothing Then
            ' Do something with the result here
            'e.Result
        End If
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim wc As New WebClient

        AddHandler wc.DownloadStringCompleted, AddressOf AlertStringDownloaded

        wc.DownloadStringAsync(New Uri("http://www.google.com"))
    End Sub
End Class