Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [VB.NET] DownloadFileAsync blocca il thread chiamante

    Salve a tutti, come da titolo, il metodo DownloadFileAsync della classe Webclient, blocca il thread chiamante, ma solo la prima volta! Dopo averci battuto la testa per giorni, sono qui a chiedervi consiglio. Di seguito riporto la classe, unica, che utilizzo:

    codice:
    Public Class Main
    
        Dim Link As String
        Dim Element As HtmlElement
        Dim ElementCollection As HtmlElementCollection
        Dim HTMLDownloadLinks As New ArrayList
        Public WithEvents Client As New Net.WebClient
        Dim CurrentLink As Uri
    
        Private Sub btnGo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGo.Click
            Me.Cursor = Cursors.WaitCursor
            Link = txtLink.Text
    
            If Not CheckLink(Link) Then
                MsgBox("Link invalid or server momentarily unreachable.", MsgBoxStyle.Critical, "Error")
                Me.Cursor = Cursors.Default
                Exit Sub
            Else
                wbBrowser.Navigate(New Uri(Link))
            End If
    
        End Sub
    
        Private Function CheckLink(ByVal xLink As String)
    
            If Not Link.Contains("www") And Not Link.Contains("http") Then
                Link = "http://www." & Link
            ElseIf Link.Contains("http") And Not Link.Contains("www") Then
                Link = Link.Replace("http://", "")
                Link = "http://www." & Link
            End If
    
            If Not Link.Contains("http") Then
                Link = "http://" & Link
            End If
    
            Dim eLink() As String = Link.Replace("http://", "").Split("/")
    
            Try
                If My.Computer.Network.Ping(eLink(0)) Then Return True
            Catch ex As Exception
                Return False
            End Try
            Return False
        End Function
    
        Private Sub SetReady()
            Me.Cursor = Cursors.Default
            Me.Size = New Size(New Point(476, 487))
            lblStatus.Text = "loaded"
            gbLink.Enabled = False
            lblStatus.ForeColor = Color.Green
            pnlStatus.BackColor = Color.YellowGreen
        End Sub
    
        Private Sub wbBrowser_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles wbBrowser.DocumentCompleted
            SetReady()
        End Sub
    
    
        Private Sub btnGetID_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGetID.Click
            If IsNothing(wbBrowser.Document.GetElementById(txtID.Text)) Then
                MsgBox("No elements found.", MsgBoxStyle.Critical, "Error")
            Else
                Element = wbBrowser.Document.GetElementById(txtID.Text)
                HTMLDownloadLinks.Add(Element)
                listElement.Items.Add(Element.OuterHtml)
            End If
        End Sub
    
        Private Sub btnGetByTag_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGetByTag.Click
            If wbBrowser.Document.GetElementsByTagName(txtName.Text).Count <= 0 Then
                MsgBox("No elements found.", MsgBoxStyle.Critical, "Error")
            Else
                ElementCollection = wbBrowser.Document.GetElementsByTagName(txtName.Text)
                For Each xElement As HtmlElement In ElementCollection
                    HTMLDownloadLinks.Add(xElement)
                    listElement.Items.Add(xElement.OuterHtml)
                Next
            End If
        End Sub
    
        Private Sub btnReset_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnReset.Click
            listElement.Items.Clear()
            txtAttr.Text = ""
            txtAttrValue.Text = ""
            txtID.Text = ""
            txtName.Text = ""
            Element = Nothing
            ElementCollection = Nothing
        End Sub
    
        Private Sub btnSelAll_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSelAll.Click
            Dim tmpCount As Int32 = listElement.Items.Count
    
            For i As Int32 = 0 To tmpCount - 1
                listElement.SetSelected(i, True)
            Next
        End Sub
    
        Public Shared vCount As Int32 = 0
        Public Shared Path As String
    
        Public Shared Links As New ArrayList
    
        Private Sub btnDownload_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDownload.Click
            Dim Count As Int32
    
    
            For Each xElement As HtmlElement In HTMLDownloadLinks
    
                If xElement.OuterHtml.Contains("<img") And listElement.SelectedItems.IndexOf(HTMLDownloadLinks(Count).OuterHTML) >= 0 Then
                    Try
                        Links.Add(New Uri(xElement.GetAttribute("src")))
                        vCount += 1
                    Catch ex As Exception
    
                    End Try
                End If
    
                If xElement.OuterHtml.Contains("<a") And listElement.SelectedItems.IndexOf(HTMLDownloadLinks(Count).OuterHTML) >= 0 Then
                    Try
                        Links.Add(New Uri(xElement.GetAttribute("href")))
                        vCount += 1
                    Catch ex As Exception
    
                    End Try
                End If
                Count += 1
            Next
    
            If vCount > 0 Then
                SetAsyncDownloading()
                saveDialog.ShowDialog()
                Path = saveDialog.SelectedPath
                If Not Path = "" Then
                    Downloadx()
                Else
                    SetAsyncDownloading(True)
                    Exit Sub
                End If
    
            Else
                MsgBox("Nothing downloadable found.", MsgBoxStyle.Critical, "Error")
                Exit Sub
            End If
    
        End Sub
    
        Private Sub btnByAttribute_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnByAttribute.Click
            If Not txtAttr.Text = "" Or Not txtAttrValue.Text = "" Then
                If wbBrowser.Document.All.Count <= 0 Then
                    MsgBox("No elements found.", MsgBoxStyle.Critical, "Error")
                Else
                    ElementCollection = wbBrowser.Document.All
                    For Each xElement As HtmlElement In ElementCollection
                        If xElement.GetAttribute(txtAttr.Text) = txtAttrValue.Text Then
                            HTMLDownloadLinks.Add(xElement)
                            listElement.Items.Add(xElement.OuterHtml)
                        End If
                    Next
                End If
            Else
                MsgBox("No elements found", MsgBoxStyle.Critical, "Error")
            End If
        End Sub
    
        Private Sub SetAsyncDownloading(Optional ByVal De_set As Boolean = False)
            If Not De_set Then
                lblStatus2.Text = "Downloading... "
                pnlStatus.BackColor = Color.Gold
            Else
                lblStatus2.Text = "Cancelled."
                pnlStatus.BackColor = Color.OrangeRed
            End If
            
        End Sub
    
        Dim cCount As Int32 = 0
        Dim xFileName As String
        Dim t As Threading.Thread
    
        Private Sub Downloadx()
    
            Me.Cursor = Cursors.WaitCursor
            btnDownload.Enabled = False
            btnByAttribute.Enabled = False
            btnGetByTag.Enabled = False
            btnGetID.Enabled = False
    
            Dim SplittedLinks() As String
    
            SplittedLinks = Links(cCount).ToString.Replace("http://", "").Split("/")
            xFileName = SplittedLinks(SplittedLinks.Length - 1)
    
            lblStatus2.Text = "Downloading... File " & (cCount + 1) & " of " & vCount
    
            Client.DownloadFileAsync(Links(cCount), Path & "\" & xFileName)
            cCount += 1
    
        End Sub
    
        Private Sub Client_OnCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs) Handles Client.DownloadFileCompleted
    
            If cCount = vCount Then
                pnlStatus.BackColor = Color.YellowGreen
                lblStatus2.Text = "Downloaded " & vCount & " files successfully."
                btnDownload.Enabled = True
                btnByAttribute.Enabled = True
                btnGetID.Enabled = True
                btnGetByTag.Enabled = True
                Me.Cursor = Cursors.Default
                Links.Clear()
                vCount = 0
                cCount = 0
            Else
                Downloadx() 'Eseguo il download di tutti gli elementi restanti, e selezionati, della listbox "listElement"
            End If
    
        End Sub
    
    End Class
    Grazie per l'attenzione.

  2. #2

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Chiarisci un po' meglio il problema ... che vuoi dire con "solo la prima volta"?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.