Hi,
habe im Internet ein Code gefunden, wie man mit Multithreading. Bei grossen dateien reagiert's nicht mehr und bei kleinen sachen kommt die datei nie an...
Hier der Code:
Wo ist der Fehler? Es kommt nirgends eine Fehlermeldung
habe im Internet ein Code gefunden, wie man mit Multithreading. Bei grossen dateien reagiert's nicht mehr und bei kleinen sachen kommt die datei nie an...
Hier der Code:
VB.NET-Quellcode
- Imports System.IO
- Imports System.ComponentModel
- Public Class Form1
- Private th As BackgroundWorker
- ' wieviele Bytes wurden kopiert
- Private lngBytesCopied As Long
- ' Die Speicheradresse der Zieldatei
- Private lngSourceFileLength As Long
- Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
- If th.IsBusy Then
- th.CancelAsync()
- End If
- End Sub
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- th = New BackgroundWorker
- AddHandler th.DoWork, AddressOf th_DoWork
- AddHandler th.RunWorkerCompleted, AddressOf th_Completed
- AddHandler th.ProgressChanged, AddressOf th_ProgressChanged
- th.WorkerReportsProgress = True
- th.WorkerSupportsCancellation = True
- Me.lblSource.Text = ""
- Me.lblTarget.Text = ""
- Me.cmdCopyAsync.Enabled = False
- Me.cmdCancel.Enabled = False
- Me.progress.Visible = False
- Me.progress.Visible = False
- End Sub
- Private Sub cmdSelectSource_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSelectSource.Click
- Dim openDlg As New OpenFileDialog
- With openDlg
- .Title = "Select file"
- .InitialDirectory = Application.StartupPath
- If .ShowDialog = Windows.Forms.DialogResult.OK Then
- Me.lblSource.Text = .FileName
- End If
- End With
- End Sub
- Private Sub cmdSelectTarget_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSelectTarget.Click
- Dim fldBrowser As New FolderBrowserDialog
- With fldBrowser
- .ShowNewFolderButton = True
- If .ShowDialog = Windows.Forms.DialogResult.OK Then
- Me.lblTarget.Text = .SelectedPath
- Me.cmdCopyAsync.Enabled = True
- End If
- End With
- End Sub
- Private Sub cmdCopyAsync_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdCopyAsync.Click
- If Me.lblTarget.Text.Length > 0 And Me.lblSource.Text.Length > 0 Then
- Me.cmdCopyAsync.Enabled = False
- Me.progress.Minimum = 0
- Me.progress.Maximum = 100
- Me.progress.Visible = True
- Me.progress.Visible = True
- Me.cmdCancel.Enabled = True
- ' Start des Threads löst dann die th_DoWork Prozedur aus
- th.RunWorkerAsync()
- End If
- End Sub
- Private Sub th_Completed(ByVal sender As Object, _
- ByVal e As RunWorkerCompletedEventArgs)
- Dim strFinished As String = String.Empty
- If e.Cancelled Then
- strFinished = "Operation Cancelled"
- ElseIf e.Error IsNot Nothing Then
- strFinished = "Operation Error " & e.Error.Message
- Else
- strFinished = "Operation Sucessfull"
- End If
- MessageBox.Show("CopyThread finished" & vbCrLf & strFinished)
- Me.cmdCopyAsync.Enabled = True
- End Sub
- Private Sub cmdCancel_Click(ByVal sender As System.Object, _
- ByVal e As System.EventArgs) Handles cmdCancel.Click
- If th.IsBusy Then
- th.CancelAsync()
- End If
- End Sub
- Private Sub th_ProgressChanged(ByVal sender As Object, _
- ByVal e As ProgressChangedEventArgs)
- Try
- Me.lblProgress.Text = lngBytesCopied.ToString & " Bytes From " & _
- lngSourceFileLength.ToString & " Copied"
- Me.progress.Value = e.ProgressPercentage.ToString
- Catch ex As Exception
- MessageBox.Show(ex.Message)
- End Try
- End Sub
- Private Sub th_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
- Dim fi As New FileInfo(Me.lblSource.Text)
- Dim inStream As FileStream = Nothing
- Dim outStream As FileStream = Nothing
- Dim buffer(2048) As Byte
- Dim offset As Integer = 0
- Try
- inStream = New FileStream(fi.FullName, FileMode.Open)
- outStream = New FileStream(Me.lblTarget.Text & "" & fi.Name, FileMode.Create)
- lngSourceFileLength = inStream.Length
- Do
- If th.CancellationPending = True Then
- e.Cancel = True
- inStream.Close()
- outStream.Close()
- Exit Sub
- End If
- offset = inStream.Read(buffer, 0, buffer.Length)
- outStream.Write(buffer, 0, offset)
- lngBytesCopied += offset
- ' WICHTIG: Hier könen wir einen Progress darstellen
- th.ReportProgress(offset / inStream.Length * 100)
- Loop Until offset = 0
- Catch ex As Exception
- MessageBox.Show(ex.Message)
- Finally
- inStream.Close()
- outStream.Close()
- End Try
- End Sub
- End Class
Wo ist der Fehler? Es kommt nirgends eine Fehlermeldung