Hi Leute, da ich in meinem Programm Multi Download einbringen möchte hab ich es eben versucht. Es klappt auch, es lädt beide Zips runter, aber...
Die Main Form "Form1" freezed ein. Aber warum? Ich benutze dazu eine BackgroundWorker, der für sich selber einen eigene Thread erstellt, und somit die Form1 nicht freezen dürfte. Wenn der Download von dem 2.Zip dann fertig ist, entfreezed die Form1 wieder und es wird im Downloader erst jetzt der Eintrag hinzugefügt.
Ich weiß das ich irgendwas mit dem MutliThreading/BackgroundWorker flasch mache, aber was?
Code :
Download
Aufruf in Form1
mfg
Die Main Form "Form1" freezed ein. Aber warum? Ich benutze dazu eine BackgroundWorker, der für sich selber einen eigene Thread erstellt, und somit die Form1 nicht freezen dürfte. Wenn der Download von dem 2.Zip dann fertig ist, entfreezed die Form1 wieder und es wird im Downloader erst jetzt der Eintrag hinzugefügt.
Ich weiß das ich irgendwas mit dem MutliThreading/BackgroundWorker flasch mache, aber was?
Code :
Download
VB.NET-Quellcode
- Public Function beginDownload(ByVal lvi As ListViewItem)
- link = lvi.SubItems(3).Text
- destination = lvi.SubItems(1).Text & "\" & lvi.Text & ".zip"
- Dim doDownload As New System.ComponentModel.BackgroundWorker()
- doDownload.RunWorkerAsync(downloading(link, destination))
- Return Nothing
- End Function
- Public Function downloading(ByVal link As String, ByVal desti As String)
- stopper = New Stopwatch
- 'Stream zur Datei im Internet erstellen und Lokal
- Dim request As HttpWebRequest = HttpWebRequest.Create(link)
- Dim response As HttpWebResponse = request.GetResponse
- breader = New BinaryReader(response.GetResponseStream)
- fstream = New FileStream(destination, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite)
- tBytes = response.ContentLength
- stopper.Start() 'Mit dem Timer messen wir, wieviele Bytes in der letzten Sekunde heruntergeladen wurden
- While (True)
- rBytes = breader.Read(buffering, 0, buffering.Length) 'Aus dem Download Stream lesen
- If rBytes = 0 Then
- Exit While 'Download ist abgeschlossen
- End If
- fstream.Write(buffering, 0, rBytes) 'Geladene Bytes lokal Speichern
- nowBytes += rBytes 'Anzahl gesammt gelesener Bytes erhöhen
- loaded_bytes += rBytes 'Anzahl der Bytes erhöhen die in der Letzten Sekunde geladen wurden
- If stopper.ElapsedMilliseconds >= 1000 Then 'Wenn eine Sekunde vergangen ist
- down_speed = 0
- down_speed = FormatNumber(loaded_bytes / 1024, 2) 'Geschwindigkeit berechnen
- loaded_bytes = 0 'und zähler zurücksetzen
- stopper.Reset() 'den Timer neustarten
- stopper.Start()
- End If
- 'Die Anzeige im Formular-Thread aktualisieren
- If down_speed < 1000 Then
- fortschritt_label.Text = down_speed & "KB"
- Else
- fortschritt_label.Text = down_speed & "MB"
- End If
- If Me.IsHandleCreated = True Then
- fortschritt_label.Invoke(New refreshGUIDel(AddressOf refreshGUI), New Object() {})
- End If
- End While
- 'Ressourcen Freigeben
- stopper.Stop()
- fstream.Close()
- breader.Close()
- Return Nothing
- End Function
Aufruf in Form1
VB.NET-Quellcode
- Private Sub WebBrowser1_Navigating(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserNavigatingEventArgs) Handles WebBrowser1.Navigating
- If e.Url.AbsoluteUri.Contains(".zip") Then
- e.Cancel = True
- Dim splitter() As String = Split(e.Url.AbsoluteUri, "/")
- Dim bit As String = splitter(splitter.Count - 2)
- Dim rn As String = bit.Replace("%20", " ")
- Dim lvi As New ListViewItem(rn)
- lvi.SubItems.Add(Application.StartupPath & "\Downloads")
- lvi.SubItems.Add("wird gedownloadet...")
- lvi.SubItems.Add(e.Url.AbsoluteUri)
- dowloader.downloads.Items.Add(lvi)
- dowloader.beginDownload(lvi)
- dowloader.Show()
- End If
- End Sub
mfg