Hallo zusammen...
Langsam bin ich echt am verzweifeln, weil ich mit meinem Downloader einfach nicht weiter komme.
Das Problem ist das ich den Download über einen Backgroundworker ablaufen lasse, und dann den Downloadstatus via Invoke in einem Label ausgeben will.
Aber genau das funktioniert nicht...
Ich bekomme immer wieder die Fehlermeldung:
Ungültiger Threatübergreifender Vorgang: Der Zugriff auf das Steuerelement Label1 erfolgte von einem anderem threat als dem Threat für den es erstellt wurde.
Private Delegate Function refreshGUIDel()
Public Function DL_Start(ByVal surl As String, ByVal sdes As String)
url = surl
Dim fsd As New SaveFileDialog
'fsd.ShowDialog()
des = sdes
If IO.File.Exists(des) Then
curBytes = IO.File.ReadAllBytes(des).Length
totBytes = curBytes
End If
worker.WorkerSupportsCancellation = True
worker.RunWorkerAsync()
End Function
Public Sub doWork(ByVal sender As Object, ByVal e As _
System.ComponentModel.DoWorkEventArgs) Handles worker.DoWork
timer = New Stopwatch
'Stream zur Datei im Internet erstellen und Lokal
Dim request As HttpWebRequest = HttpWebRequest.Create(url)
'###################
'Download fortsetzen falls curBytes > 0
request.Proxy = Nothing
request.AddRange(CInt(curBytes))
Dim response As HttpWebResponse = request.GetResponse
If Not response.StatusCode = HttpStatusCode.PartialContent Then
'falls der Server wiederaufnahme nicht unterstützt bei 0 anfangen
curBytes = 0
End If
'###################
bis = response.GetResponseStream
If curBytes > 0 Then
fos = New FileStream(des, FileMode.Append, FileAccess.Write)
totBytes = response.ContentLength + curBytes
Else
fos = New FileStream(des, FileMode.Create, FileAccess.Write)
totBytes = response.ContentLength
End If
timer.Start() 'Mit dem Timer messen wir, wieviele
' Bytes in der letzten Sekunde heruntergeladen wurden
Try
While (True)
readBytes = bis.Read(buffer, 0, buffer.Length) 'Aus dem
' Download Stream lesen
If readBytes = 0 Then
'MessageBox.Show("fertig")
DL_fertig()
Exit While 'Download
' ist abgeschlossen
End If
fos.Write(buffer, 0, readBytes) 'Geladene
' Bytes lokal Speichern
curBytes += readBytes 'Anzahl
' gesammt gelesener Bytes erhöhen
loaded += readBytes 'Anzahl der
' Bytes erhöhen die in der Letzten Sekunde geladen wurden
If timer.ElapsedMilliseconds >= 1000 Then 'Wenn
' eine Sekunde vergangen ist
speed = 0
speed = FormatNumber(loaded / 1024, 2) _
'Geschwindigkeit berechnen
loaded = 0 'und zähler
' zurücksetzen
timer.Reset() 'den Timer
' neustarten
timer.Start()
End If
'Die Anzeige im Formular-Thread aktualisieren
Label1.Invoke(New refreshGUIDel(AddressOf refreshGUI), New _
Object() {})
End While
Catch ex As Exception
MsgBox(Prompt:="Fehlercoding: " & ex.Message)
End Try
'Ressourcen Freigeben
timer.Stop()
fos.Close()
bis.Close()
End Sub
Private Sub workerDisposing(ByVal sender As Object, ByVal e As _
System.EventArgs) Handles worker.Disposed
'Die Streams schließen, da sonst die temporäre Datei nicht gelöscht
' werden kann!
fos.Close()
bis.Close()
End Sub
Public Function refreshGUI()
'Die Fortschrittsanzeige aktualisieren
Me.ProgressBar1.Maximum = totBytes
Me.ProgressBar1.Value = curBytes
Me.Label1.Text = FormatNumber(curBytes / 1024, 0) & " / " & _
FormatNumber(totBytes / 1024, 0) & " Geschwindigkeit: " & speed & "" & _
"KB/s"
End Function
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As _
System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
'Wenn das Formular geschlossen wird während der Download noch läuft,
' diesen erst beenden und Ressourcen freigeben
If worker.IsBusy Then
worker.CancelAsync()
worker.Dispose()
End If
End Sub |