VB.NET DownloadDataAsync: - PullRequest
       7

VB.NET DownloadDataAsync:

0 голосов
/ 04 марта 2010

У меня худшие проблемы с обходом ошибки, и я надеюсь, что смогу получить совет на этом сайте. Короче говоря, я пытаюсь сделать асинхронный вызов веб-службы из моего приложения VB.NET. Но мой обратный вызов client_DownloadDataCompleted НИКОГДА не вызывается после завершения загрузки.

Вот мой полный код:

Public Sub BeginAsyncDownload(ByVal Url As String)

    Dim waiter As System.Threading.AutoResetEvent = New System.Threading.AutoResetEvent(False)
    Dim client As WebClient = New WebClient()

    'client_DownloadDataCompleted method gets called when the download completes.
    AddHandler client.DownloadDataCompleted, AddressOf client_DownloadDataCompleted

    Dim uri As Uri = New Uri(Url)
    Downloading = True  'Class variable defined elsewhere
    client.DownloadDataAsync(uri, waiter)

End Sub

Private Sub client_DownloadDataCompleted(ByVal sender As Object, ByVal e As AsyncCompletedEventArgs)
    MessageBox.Show("Download Completed")
    Downloading = False
    Debug.Print("Downloaded")
End Sub

Опять же, метод client_DownloadDataCompleted никогда не вызывается. Я также пытался использовать метод:

Private Sub client_DownloadDataCompleted(ByVal sender As Object, ByVal e As DownloadDataCompletedEventArgs)

Без удачи. Что мне действительно нужно, так это то, что переменная «Загрузка» отключается после завершения загрузки.

Заранее спасибо! Brett

Ответы [ 3 ]

1 голос
/ 06 февраля 2012

Клиент (Webclient) должен быть объявлен вне подпрограммы BeginAsyncDownload, поэтому он имеет видимость уровня формы / класса. Пожалуйста, обратитесь к следующему коду:

Public Class Form1
    Dim client as New WebClient()
    Private Sub BeginAsyncDownload(ByVal Url As String)  
       AddHandler client.DownloadDataCompleted, AddressOf client_DownloadDataCompleted                    

       Dim uri As Uri = New Uri(Url)                    
       Downloading = True  'Class variable defined elsewhere                    
       client.DownloadDataAsync(uri, waiter)   
    End Sub

Private Sub client_DownloadStringCompleted(ByVal sender As Object, ByVal e As System.Net.DownloadStringCompletedEventArgs)
   MessageBox.Show("Download Completed")                      
   Downloading = False                      
   Debug.Print("Downloaded")              
End Sub
0 голосов
/ 06 февраля 2012

В каком контексте вы вызываете веб-клиента? WebClient заберет ваш SynchronizationContext.Current и отправит ему обратный вызов о его завершении.

Если вы используете WinForms и ваш поток пользовательского интерфейса заблокирован, он никогда не сможет обработать ваш обратный вызов.

0 голосов
/ 04 марта 2010

Это сложный вопрос. Я потратил немного времени на это и не смог понять, почему его не вызвали, извините.

Если вы не можете заставить это работать, у меня есть код для CodePlex, который включает класс WebHelper , который может вам помочь. Я попытался сделать его таким же простым в использовании, как WebClient, но со всей мощью HttpWebRequest.

Проект называется BizArk . Я написал это просто как хранилище кода для себя. Не стесняйтесь просто использовать нужные биты, меня не интересует, как используется код (если он не используется для зла :).

...