I Thread-Sicherheit für besseres Verständnis Testen wurde, und das ist, was ich tat:Objektsperre funktioniert nicht für Threadsicherheit
Ich habe einen Typ ThreadSample
genannt, die zwei Methoden haben und dies, wo Verriegelung geschieht:
internal class ThreadTime
{
public void doSomething(string message)
{
lock (this)
{
DialogResult t = MessageBox.Show(message);
Thread.Sleep(2000);
}
}
public void anotherLife(string message)
{
MessageBox.Show("This is coming from anotherLife method and and current threadNumber is " + message);
}
}
Grundsätzlich ist die Idee, wenn doSomething()
genannt wird, sollte es die ganze Objekte und andere Threads sperren können sogar anotherLife
Methode aufrufen, da sie darauf warten, dass andere Threads die Verriegelung zu lösen.
Das ist die Logik Entriegelungselement zu simulieren:
Wenn Form
initialisiert wird, wird eine neue Thread
und ThreadSample
erstellt:
public partial class Form1 : Form
{
private ThreadTime time;
private Thread thread;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
thread = new Thread(new ThreadStart(workerThread));
time = new ThreadTime();
}
private void button1_Click(object sender, EventArgs e)
{
thread.Start();
//Thread.Sleep(1000);
time.anotherLife("Current thread is = " + "UI Thread");
}
private void workerThread()
{
//time.doSomething("Current thread is = " + Thread.CurrentThread.ManagedThreadId);
time.doSomething("Worker Thread");
}
}
Wie Sie im Code rechts unten sehen können. Wenn der Benutzer dann auf button1
klickt, wird der Thread gestartet und der UIThread erreicht und ruft anotherLife
auf, was zunächst nicht Thread-sicher ist.
Anyways, der Ausgang ist:
- Es gibt zwei MessageBox zugleich gezeigt.
Was ich erwartet hatte, wenn die neuen Thread doSomething()
ruft es die Sperre des Objekts und UIThread
wartet auf die Sperre in der Lage sein werden, freigegeben wird anotherLife
Methode aufzurufen.
Kann jemand erklären warum?
Danke.
Warum haben Sie das Java-Tag, wenn dies eindeutig C# ist? Und warum verwenden Sie Java-Namenskonventionen in C#? –
So wie ich Ihre Frage gelesen habe, klingt es so, als hätten Sie eine falsche Vorstellung davon, wie Schlösser funktionieren. Eine Sperre für ein Objekt ist nur ein Token für die Synchronisierung. Dem Sperrobjekt selbst passiert nichts. –
Vielleicht bezieht sich der Java-Tag eher auf die Konventionen als auf die Sprache? –