Zumindest wird die Oberfläche durch eine lange Aufgabe nicht blockiert und die Oberfläche bleibt reaktionsfähig. Aber, dass das jetzt per Definition nicht unbedingt ein neuer Thread ist, das wäre mir neu.
Await Threading.Tasks.Task.Run
scheint nicht zwangsläufig einen eigenständigen Thread zu starten. Bin aber nicht genügend in der Materie drin, um es erklären zu können.
Problem mit Event und verschiedenen Task
- VB.NET
- .NET (FX) 4.5–4.8
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 45 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.
-
-
Und so bleibt weiterhin im Dunkeln, warum ein Thread zu einer
UnhandledException
führen kann, ein (zu einfacher?) Task hingegen zu einerThreadException
, die ja nur im GUI-Thread entstehen kann, laut Microsoft.Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.
Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln. -
So habe nun meine Klasse für das kopieren und zippen gesäubert usw. Habe dann bei testen festgestellt, das ein RaiseEventHandler nicht passte.
RaiseEvent NotificationsID(Notification.Failure, propertyValues.errorHdd)
Hier wurde bei einem Fehler der Timer nicht gestartet
ALT:
Neu:
Die bereinigte Klasse.
Spoiler anzeigen
Auszug aus dem MainForm
VB.NET-Quellcode
- Public Class frmMain
- Private logger As New Logging()
- Private drivehelper As New DriveManager()
- Private xmlhelper As New XmlManager()
- Private WithEvents copyzip As New CopyZip(drivehelper)
- Private enterPressed As Boolean = False
- Public Sub New()
- AddHandler Application.ThreadException, AddressOf ExceptionHandlerForErrors
- AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf ExceptionHandlerForErrors
- InitializeComponent()
- CheckXmlFile()
- End Sub
- Private Sub ExceptionHandlerForErrors(sender As Object, e As System.Threading.ThreadExceptionEventArgs)
- ShowError(e.Exception)
- End Sub
- Private Sub ExceptionHandlerForErrors(sender As Object, e As System.UnhandledExceptionEventArgs)
- ShowError(DirectCast(e.ExceptionObject, Exception))
- End Sub
- Private Sub ShowError(ex As Exception)
- logger.ExceptionToFile("Ein Fehler ist aufgetreten!" & Environment.NewLine & ex.Message)
- MessageBox.Show("Ein unerwarteter Fehler ist aufgetreten!" & Environment.NewLine & ex.Message, "Wichtige Info", MessageBoxButtons.OK, MessageBoxIcon.Warning)
- End Sub
VB.NET-Quellcode
- Public Class CopyZip
- '' Definiert die verschiedenen Benachrichtigungstypen
- Friend Enum Notification
- Copy
- Zip
- Both
- End Enum
- '' ManagerClass für Laufwerke und Pfadinformationen
- Private propertyValues As New DriveManager()
- Private Property HDDS As DriveInfo() = DriveInfo.GetDrives()
- 'Friend Event FailureHDD(FailureHDD As String)
- Friend Event NotificationsID(NotificationID As Notification)
- Friend Event ZipFileReport(ReportedFileName As String)
- Friend Event CopyFileReport(ReportedFileName As String)
- Public Sub New(propInfo As DriveManager)
- propertyValues = propInfo
- End Sub
- ''' <summary>
- ''' Überprüft die Verfügbarkeit der Laufwerke und meldet ggf. einen Fehler.
- ''' </summary>
- Private Sub CheckDrives()
- Dim isSourcePathReady As Boolean = propertyValues.IsDriveReady(propertyValues.SourcePath)
- Dim isTargetCopyPathReady As Boolean = propertyValues.IsDriveReady(propertyValues.TargetCopyPath)
- Dim isTargetZipPathReady As Boolean = propertyValues.IsDriveReady(propertyValues.TargetZipPath)
- Dim affectedDrive As String = Nothing
- If Not isSourcePathReady Then
- affectedDrive = propertyValues.SourcePath
- ElseIf Not isTargetCopyPathReady Then
- affectedDrive = propertyValues.TargetCopyPath
- ElseIf Not isTargetZipPathReady Then
- affectedDrive = propertyValues.TargetZipPath
- End If
- '' Auskommentiert, weil zur Zeit nicht nötig ist, da auf dem MainForm abgefangen wird.
- 'If Not String.IsNullOrEmpty(affectedDrive) Then
- ' RaiseEvent FailureHDD(affectedDrive)
- 'End If
- End Sub
- ''' <summary>
- ''' Ruft den asyncronen Vorgang basierend auf dem ausgewählten Typ auf.
- ''' </summary>
- Friend Sub StartCopyZipThreads(SelectedCopytype As Integer)
- Select Case SelectedCopytype
- Case Is = 0
- CopyAsync()
- Case Is = 1
- ZipAsync()
- Case Is = 2
- CopyZipAsync()
- End Select
- End Sub
- ''' <summary>
- ''' CopyAsync & ZipAsync & CopyZipAsync
- ''' Startet jeweils den asyncronen Kopier- oder Zip-Vorgang basierend auf dem ausgewählten Typ.
- ''' </summary>
- Private Async Sub CopyAsync()
- Await Threading.Tasks.Task.Run(Function() DoFileCopy())
- RaiseEvent NotificationsID(Notification.Copy)
- End Sub
- Private Async Sub ZipAsync()
- Await Threading.Tasks.Task.Run(Function() DoFileZip())
- RaiseEvent NotificationsID(Notification.Zip)
- End Sub
- Private Async Sub CopyZipAsync()
- Await Threading.Tasks.Task.Run(Function() DoFileCopy())
- Await Threading.Tasks.Task.Run(Function() DoFileZip())
- RaiseEvent NotificationsID(Notification.Both)
- End Sub
- ''' <summary>
- ''' Führt das Zippen der Dateien aus.
- ''' </summary>
- Private Function DoFileZip() As Boolean
- CheckDrives()
- Dim FiledateSuffix As String = Date.Now.ToString("-HH_mm")
- If Not Directory.Exists(propertyValues.TargetZipPath) Then Directory.CreateDirectory(propertyValues.TargetZipPath)
- RaiseEvent ZipFileReport(propertyValues.TargetZipPath & FiledateSuffix)
- ZipFile.CreateFromDirectory(propertyValues.SourcePath, propertyValues.TargetZipPath & FiledateSuffix & ".zip", CompressionLevel.Fastest, False)
- If Not System.IO.Directory.GetFiles(propertyValues.TargetZipPath).Length = 0 Then
- Else
- IO.Directory.Delete(propertyValues.TargetZipPath)
- End If
- Return True
- End Function
- ''' <summary>
- ''' Führt das Kopieren der Dateien aus.
- ''' </summary>
- Private Function DoFileCopy() As Boolean
- CheckDrives()
- Dim NewSourcePath As New IO.DirectoryInfo(propertyValues.SourcePath), file As IO.FileInfo
- If IO.Directory.Exists(propertyValues.TargetCopyPath) = False Then IO.Directory.CreateDirectory(propertyValues.TargetCopyPath)
- For Each file In NewSourcePath.GetFiles()
- RaiseEvent CopyFileReport(propertyValues.TargetCopyPath & "\" & file.Name)
- IO.File.Copy(file.FullName.ToString, propertyValues.TargetCopyPath & "\" & file.Name.ToString, True)
- Next
- For Each subdir In NewSourcePath.GetDirectories()
- Call Subfoldercopy(subdir.FullName.ToString, propertyValues.TargetCopyPath & "\" & subdir.Name.ToString, True)
- Next
- Return True
- End Function
- ''' <summary>
- ''' Kopiert Dateien und Verzeichnisse rekursiv.
- ''' </summary>
- Private Sub Subfoldercopy(ByVal SubSource As String, ByVal Destination As String, ByVal Overwrite As Boolean)
- CheckDrives()
- Dim subdir As IO.DirectoryInfo, diSubSource As New IO.DirectoryInfo(SubSource), file As IO.FileInfo
- If IO.Directory.Exists(Destination) = False Then IO.Directory.CreateDirectory(Destination)
- For Each file In diSubSource.GetFiles()
- RaiseEvent CopyFileReport(file.FullName)
- If (IO.File.Exists(Destination & "\" & file.Name.ToString) AndAlso Overwrite = False) = False Then _
- IO.File.Copy(file.FullName.ToString, Destination & "\" & file.Name.ToString, Overwrite)
- Next
- For Each subdir In diSubSource.GetDirectories()
- Call Subfoldercopy(subdir.FullName.ToString, Destination & "\" & subdir.Name.ToString, Overwrite)
- Next
- End Sub
- End Class
Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. -
VaporiZed schrieb:
Await Threading.Tasks.Task.Run
scheint nicht zwangsläufig einen eigenständigen Thread zu starten.
Ein Einzeiler:
Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
Solange keiner hier schlüssig erklären kann, warum dann solche Exceptions im
ThreadException
-EventHandler und nicht imUnhandledException
-EventHandler landen, bleibt die Unklarheit bestehen.
Da bringt diese stackoverflow-Diskussion schon etwas mehr Licht ins Dunkel. Da heißt es zwar auchBecause Tasks != Threads.
- aber das ist nicht sonderlich zielführend, auch wenn es meinen Punkt unterstützt
Auch Microsoft sagt was dazu. Letztenendes wohl: Ein exceptionerzeugender Task gibt seine Infos inkl. Exception an den aufrufenden Thread (z.B. GUI-Thread) zurück und so landet die Exception, wenn sie nicht behandelt wird, imThreadException
-EventHandler und nicht wie eine Exception aus einem autarken Thread imUnhandledException
-EventHandler.
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.
Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()
-
Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert!
-
Tags
-
Ähnliche Themen
-
cg1985 - - Sonstige Problemstellungen
-
6 Benutzer haben hier geschrieben
- Amelie (15)
- VaporiZed (12)
- RodFromGermany (9)
- Haudruferzappeltnoch (5)
- ErfinderDesRades (4)
- Bartosz (1)