Hallo,
ich experimentiere gerade mit Threads und dem beenden eines laufenden Threades. Dazu habe ich mir aus dem Galileo Online Handbuch aus Kapitel 18.3.5 das Beispiel FileWatchService rauskopiert und in eine Konsolenanwendung abgeändert. Da in VB2008 Thread.Resume und Thread.suspend als veraltet genannt werden habe ich versucht ohne diese beiden auszukommen und ganz simpel Thread.Start und Thread.Abort zu benutzen.
Jetzt habe ich aber festgestellt, das der Thread trotz Thread.Abort nicht beendet wird. Woran kann das liegen?
Hier mal ein Auszug meines Codes:
Hier das Hauptmodul
Hier der Thread
ich experimentiere gerade mit Threads und dem beenden eines laufenden Threades. Dazu habe ich mir aus dem Galileo Online Handbuch aus Kapitel 18.3.5 das Beispiel FileWatchService rauskopiert und in eine Konsolenanwendung abgeändert. Da in VB2008 Thread.Resume und Thread.suspend als veraltet genannt werden habe ich versucht ohne diese beiden auszukommen und ganz simpel Thread.Start und Thread.Abort zu benutzen.
Jetzt habe ich aber festgestellt, das der Thread trotz Thread.Abort nicht beendet wird. Woran kann das liegen?
Hier mal ein Auszug meines Codes:
Hier das Hauptmodul
VB.NET-Quellcode
- Imports System.Threading
- Module Start
- 'Event zum Beenden
- Public Event Finished()
- Private th As Thread
- Private SavArgs As String
- Private path As String = "f:\\"
- Sub Main()
- Dim Auswahl As String = ""
- MyScreenWrite()
- Do Until Auswahl = "x"
- Auswahl = MyScreenRead()
- Select Case Auswahl
- Case "1"
- Dim w As New worker(path)
- th = New Thread(New ThreadStart(AddressOf w.StartWorker))
- th.Start()
- Auswahl = ""
- Case "2"
- RaiseEvent Finished()
- th.Abort()
- th = Nothing
- Auswahl = ""
- Case "x"
- Case Else
- Console.WriteLine("Ungültige Auswahl -> " & Auswahl)
- End Select
- Loop
- End Sub
- Sub MyScreenWrite()
- Console.WriteLine("Bitte eine Auswahl treffen")
- Console.WriteLine("1 - Starten der Protokollierung")
- Console.WriteLine("2 - Beenden der Protokollierung")
- Console.WriteLine("x - Ende der Anwendung")
- End Sub
- Function MyScreenRead() As String
- MyScreenRead = Console.ReadLine()
- End Function
- End Module
Hier der Thread
VB.NET-Quellcode
- Imports System.Threading
- Public Class worker
- Private DoRun As Boolean = True
- Private protocolFile As String = IO.Path.Combine( _
- IO.Path.GetDirectoryName( _
- Process.GetCurrentProcess().MainModule.FileName), "FileWatchLog.log")
- Private path As String = "f:\zDonwloads\"
- Public Sub New(ByVal path As String)
- If Not String.IsNullOrEmpty(path) Then Me.path = path
- End Sub
- ' Startmethode des Threads
- Public Sub StartWorker()
- Dim fsw As New IO.FileSystemWatcher(Me.path)
- fsw.IncludeSubdirectories = True
- fsw.EnableRaisingEvents = True
- 'Dim th As ThreadAbortException
- AddHandler fsw.Changed, AddressOf ChangeFile (Wegen Übersichtlichkeit gelöscht)
- AddHandler fsw.Deleted, AddressOf DeleteFile (Wegen Übersichtlichkeit gelöscht)
- AddHandler fsw.Created, AddressOf CreateFile (Wegen Übersichtlichkeit gelöscht)
- AddHandler fsw.Renamed, AddressOf RenameFile (Wegen Übersichtlichkeit gelöscht)
- AddHandler Start.Finished, AddressOf EndThread
- Try
- ' in der Schleife wird auf etwaige Änderungen im Dateisystem gewartet
- While DoRun = True
- If DoRun = True Then
- fsw.WaitForChanged(IO.WatcherChangeTypes.All)
- Else
- fsw.EnableRaisingEvents = False
- End If
- End While
- Catch : End Try
- fsw.EnableRaisingEvents = False
- End Sub
- .
- .
- .
- .
- ' Soll diesen Thread beenden
- Private Sub EndThread()
- DoRun = False
- End Sub
- End Class