Übersetzung des Snippets von Jimpanse in VB.NET
Hier wird eine Variable von zwei Threads benutzt und mittels lock für den jeweiligen Thread gesperrt, damit die Benutzung der Variable Threadsafe ist.
Der zweite Thread geht eine Liste von Zahlen durch und schreibt diese mit einer Scheife in eine Variable, diese Variable wird vom Mainthread verglichen und ggf. in der Console ausgegeben. Sobald sich current_process ändert, wird diese wieder in der Console ausgegeben.
Ich habe beide cs-dateien in den Code eingefügt, ihr könnt die Dateien jeweils kompilieren, es läuft ohne Änderung einwandfrei.
Hoffe das hilft Jemanden.
Gruß
Jim
==== Program.vb ====
Imports System
Imports System.Collections.Generic
Imports System.Windows.Forms
Imports System.Threading
Namespace threads_syncen
Public Class Program
<STAThread()> _
Public Shared Sub Main()
Console.WriteLine("==================Threads==================")
Dim puffer As Integer = 0
Dim demo As New Class1()
Dim auftrag_bearbeiten As New Thread(New ThreadStart(demo.auftrag))
'auftrag_bearbeiten.Priority = ThreadPriority.AboveNormal;//so kann man auch bewirken das der Thread mehr CPUZeit bekommt und somit ruckzuck der Bool auf True gesetzt wird
auftrag_bearbeiten.Start()
'damit der gerade gestartete Thread auch die Zeit hat den Bool zu ändern
Thread.Sleep(10)
While Class1.auftrag_laeuft = True
SyncLock demo
'Object wird gesperrt, damit der Mainthread auf current_process sicher zugreifen kann
If puffer <> Class1.current_process Then
Console.WriteLine(Class1.current_process)
puffer = Class1.current_process
End If
End SyncLock
End While
'damit sich die Console nicht sofort schließt
Console.WriteLine("" & Chr(10) & "" + "Taste druecken um zu beenden")
Console.ReadKey()
End Sub
End Class
End Namespace
==== Class1.vb ====
Imports System
Imports System.Collections.Generic
Imports System.Text
Imports System.Threading
Namespace threads_syncen
Public Class Class1
'der Aktuelle Auftrag
Public Shared current_process As Integer = 0
Public Shared auftrag_laeuft As Boolean = False
'Zahlen die durchgegangen werden und vom MainThread verglichen werden
Private nummern As Integer() = New Integer() {101, 102, 103, 104, 105, 106, _
107, 108, 109, 110, 111, 112, _
113}
Public Sub auftrag()
auftrag_laeuft = True
For i As Integer = 0 To nummern.Length - 1
current_process_setzen(nummern(i))
'do some Work
Thread.Sleep(400)
Next
auftrag_laeuft = False
End Sub
'Methode um current_process zu sperren fuer den Thread
Private Sub current_process_setzen(ByVal nummer As Integer)
SyncLock Me
current_process = nummer
End SyncLock
End Sub
End Class
End Namespace
Kommentare zum Snippet