Загрузка файла и BackgroundWorker

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Maxim-V
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 30.04.2012 (Пн) 12:45

Загрузка файла и BackgroundWorker

Сообщение Maxim-V » 27.05.2012 (Вс) 1:09

Помогите, пожалуйста, разобраться, в чем может быть проблема.

У меня есть форма 1 (Form1), из которой я запускаю форму 2 с индикатором загрузки (Form2) и запускаю параллельный поток для скачивания файла (BackgroundWorker1).
При первой попытке скачать файл всегда все отлично работает, но если пытаюсь скачать файл 4 и более раза, то скачивание не происходит и параллельный поток подвисает. При этом если Form1 закрыть, а потом открыть, то все снова работает (1-ый раз по крайней мере), а потом снова висит.

Вроде и параллельный поток освобождаю и переменные форм, но проблема все-равно сохраняется...

Код: Выделить всё
Public Class Form1
   
    Public РазмерФайлаПК As Long
    Public РазмерФайлаСервера As Long

    Public Ссылка As String = "http://download.microsoft.com/download/7/0/3/703455ee-a747-4cc8-bd3e-98a615c3aedb/dotNetFx35setup.exe"
   
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
      
   'узнаем размер файла на сервере
        Dim req = HttpWebRequest.Create(Ссылка)
        Dim resp = req.GetResponse
        РазмерФайлаСервера = resp.ContentLength
        req = Nothing
        resp = Nothing

        BackgroundWorker1.RunWorkerAsync()

        Form2.Show()
        Form2.Timer1.Enabled = True

    End Sub
   
   
    Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        'начинаем загрузку файла на ПК
        Dim wc As New System.Net.WebClient      'Создаем событие WebClient
        wc.Proxy = Nothing
        wc.Credentials = CredentialCache.DefaultCredentials
        wc.DownloadFile(Ссылка, "c:\1.zip")
        'wc = Nothing
    End Sub


    Private Sub BackgroundWorker1_RunWorkerCompleted(sender As System.Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        Form2.Close()
        Form2.Timer1.Dispose()
        Form2.Dispose()
        BackgroundWorker1.Dispose()
    End Sub
   
End Class
   
   
Public Class Form2

    Dim fi As FileInfo

    Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
      
   'узнаем размер файла на ПК
        fi = New FileInfo("c:\1.zip")
        Form1.РазмерФайлаПК = fi.Length
        fi = Nothing

        ProgressBar1.Value = (Form1.РазмерФайлаПК * 100%) / Form1.РазмерФайлаСервера

        If Form1.РазмерФайлаПК = Form1.РазмерФайлаСервера Then
            Form1.BackgroundWorker1.CancelAsync()
            Timer1.Enabled = False
            Me.Close()
        End If

    End Sub

End Class

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 27.05.2012 (Вс) 3:19

Код кривой. По крайней мере, на первый взгляд.

Почему не работает? Количество соединений для приложения ограничено (по умолчанию 2 или 4 - не помню), а ты их не закрываешь. Надо использовать Using или (как минимум) вызывать Close. Присваивать Nothing - это не то. К тому же, для получения размера лучше посылать HEAD.

Maxim-V
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 30.04.2012 (Пн) 12:45

Re: Загрузка файла и BackgroundWorker

Сообщение Maxim-V » 29.05.2012 (Вт) 20:10

Согласен, код кривоват. Буду дорабатывать.
С Close все заработало. Спасибо за подсказку.

Пример нужного мне прогресс бара нашел в сети:
Код: Выделить всё
Dim WithEvents wc As New System.Net.WebClient 'Создаем событие, вызываемое WebClient
   
Private Sub ButtonDownload_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ButtonDownload.Click
   wc.DownloadFileAsync(New Uri("откуда качаем"), "куда сохраняем")
End Sub
   
Private Sub wc_DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs) Handles wc.DownloadFileCompleted
   ProgressBar1.Value = 0 'Загрузки завершены
End Sub
   
Private Sub wc_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles wc.DownloadProgressChanged
   ProgressBar1.Value = e.ProgressPercentage 'Показываем прогресс скачивания
End Sub


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 52

    TopList