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.