Получение веб-страницы после вызова DownloadStringAsync()?

Я еще недостаточно знаю VB.Net, чтобы использовать более богатый класс HttpWebRequest, поэтому я решил использовать более простой класс WebClient для асинхронной загрузки веб-страниц (чтобы избежать зависания пользовательского интерфейса).

Однако как асинхронный обработчик событий может фактически вернуть веб-страницу вызывающей процедуре?

Imports System.Net

Public Class Form1
    Private Shared Sub DownloadStringCallback2(ByVal sender As Object, ByVal e As DownloadStringCompletedEventArgs)
        If e.Cancelled = False AndAlso e.Error Is Nothing Then
            Dim textString As String = CStr(e.Result)

            'HERE : How to return textString to the calling routine?
        End If
    End Sub

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

        AddHandler client.DownloadStringCompleted, AddressOf DownloadStringCallback2
        Dim uri As Uri = New Uri("http://www.google.com")

        client.DownloadStringAsync(uri)

        'HERE : how to get web page back from callback function?
    End Sub
End Class

Спасибо.


Редактировать: я добавил глобальную общую переменную и While/DoEvents/EndWhile, но должен быть более чистый способ сделать это: -/

Public Class Form1
    Shared page As String

    Public Shared Sub AlertStringDownloaded(ByVal sender As Object, ByVal e As DownloadStringCompletedEventArgs)
        '  If the string request went as planned and wasn't cancelled:
        If e.Cancelled = False AndAlso e.Error Is Nothing Then
            page = CStr(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

        page = Nothing
        wc.DownloadStringAsync(New Uri("http://www.google.com"))
        'Better way to wait until page has been filled?
        While page Is Nothing
            Application.DoEvents()
        End While
        RichTextBox1.Text = page
    End Sub
End Class

person Gulbahar    schedule 24.04.2010    source источник


Ответы (2)


Вы можете установить RichTextBox1.Text непосредственно в завершенном обработчике, если сделаете функцию обработчика методом экземпляра, а не общим.

Public Class Form1

    Private Sub AlertStringDownloaded(ByVal sender As Object, ByVal e As DownloadStringCompletedEventArgs)
        '  If the string request went as planned and wasn't cancelled:
        If e.Cancelled = False AndAlso e.Error Is Nothing Then
            RichTextBox1.Text = CStr(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

        page = Nothing
        wc.DownloadStringAsync(New Uri("http://www.google.com"))
    End Sub
End Class
person Gideon Engelberth    schedule 24.04.2010
comment
Спасибо за совет по общедоступному и частному. - person Gulbahar; 27.04.2010

Вы не нашли чистого пути. Закройте форму, пока идет загрузка, и посмотрите, какой бум вы получите. Вам нужно как минимум установить для свойства Enabled формы значение False.

Посмотрите на класс BackgroundWorker, чтобы сделать это чисто.

person Hans Passant    schedule 24.04.2010
comment
Я хотел бы отображать форму, пока приложение занято загрузкой файлов. Я попробую отключить его, а там посмотрим, как пойдет. Спасибо. - person Gulbahar; 27.04.2010