Я тестировал потокобезопасность для лучшего понимания, и вот что я сделал:
У меня есть тип с именем ThreadSample
, который имеет два метода, и здесь происходит блокировка:
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);
}
}
По сути, идея заключается в том, что при вызове doSomething()
он должен блокировать все объекты, и другие потоки могут даже вызывать метод anotherLife
, поскольку они ожидают, пока другие потоки снимают блокировку.
Это логика для имитации снятия блокировки:
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");
}
}
Как вы можете видеть в коде справа:
При инициализации Form
создаются новые Thread
и ThreadSample
. Затем, когда пользователь нажимает на button1
, запускается поток, и UIThread достигает и вызывает anotherLife
, который сначала не является поточно-ориентированным.
В любом случае, вывод:
- Одновременно отображаются два MessageBox.
Я ожидал, что когда новый поток вызовет doSomething()
, он получит блокировку объекта и UIThread
ожидает, пока блокировка будет снята, чтобы вызвать метод anotherLife
.
Может кто-нибудь объяснить, почему?
Спасибо.