2010-03-03 9 views
0

J'ai le plus gros problème pour contourner un bug, et j'espère pouvoir obtenir quelques conseils sur ce site. En bref, j'essaie de faire un appel de service Web asynchrone à partir de mon application VB.NET. Mais mon callback "client_DownloadDataCompleted" n'est JAMAIS appelé lorsque le téléchargement est terminé.VB.NET DownloadDataAsync:

Voici mon code complet:

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 

Encore une fois, la méthode client_DownloadDataCompleted est jamais appelé. J'ai également essayé d'employer la méthode:

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

Sans la chance. Ce dont j'ai vraiment besoin, c'est que la variable "Téléchargement" soit désactivée lorsque le téléchargement est terminé.

Merci d'avance! Brett

Répondre

0

Ceci est difficile. J'ai passé un peu de temps là-dessus et je n'ai pas compris pourquoi on ne l'appelait pas, désolé.

Si vous ne parvenez pas à faire fonctionner ceci, j'ai du code sur CodePlex qui inclut une classe WebHelper qui pourrait vous aider. J'ai essayé de le rendre aussi facile à utiliser que WebClient mais avec toute la puissance de HttpWebRequest.

Le projet s'appelle BizArk. Je l'ai écrit comme un dépôt de code pour moi-même. N'hésitez pas à utiliser les bits que vous voulez, je n'ai aucun intérêt particulier dans la façon dont le code est utilisé (tant qu'il n'est pas utilisé pour le mal :).

1

Le client (client Web) doit être déclaré en dehors du sous-programme BeginAsyncDownload, de sorte qu'il ait une visibilité de niveau formulaire/classe. Veuillez vous référer au code suivant:

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

Dans quel contexte invoquez-vous le client? WebClient récupèrera votre SynchronizationContext.Current et affichera son rappel d'achèvement.

Si vous utilisez WinForms et que votre thread d'interface utilisateur est bloqué, il ne pourra jamais traiter votre rappel.