Остановить зависание формы при загрузке строки с веб-сайта

В моем приложении есть веб-клиент, который должен загружать строку с веб-сайта. Он загружает довольно большой объем текста, около 20 строк или около того. Однако, когда я загружаю текст, графический интерфейс зависает во время загрузки, а затем возобновляет работу после завершения загрузки. Как я могу предотвратить это?

Я использую Visual Basic 2010, .NET 4.0, Windows Forms и Windows 7 x64.


person Penguin    schedule 06.08.2013    source источник
comment
Используйте вызов AJAX для асинхронного извлечения строки. Для получения дополнительной помощи опубликуйте код.   -  person    schedule 06.08.2013


Ответы (3)


Для этого можно использовать библиотеку параллельных задач.

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 она есть, поэтому я бы выбрал ответ Карла Андерсона

person I4V    schedule 06.08.2013
comment
Вот это сексуально. Существуют также асинхронные методы для WebClient. - person OneFineDay; 06.08.2013
comment
Вы серьезно, что я использую! - person OneFineDay; 06.08.2013
comment
@DonA Если речь идет о моем удаленном комментарии: я думал, вы говорите о async/await (WebClient.DownloadStringTaskAsync) - person I4V; 06.08.2013

Выполняйте трудоемкие задачи в рабочих потоках, а не в потоке графического интерфейса. Это предотвратит зависание цикла событий.

person Hyperboreus    schedule 06.08.2013

Другой альтернативой является использование DownloadStringAsync, это вызовет запрос из потока пользовательского интерфейса, но не заблокирует поток, поскольку это асинхронный запрос. Вот пример использования 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
person Karl Anderson    schedule 06.08.2013