Я написал этот код, начиная с нового проекта winform.
public partial class Form1 : Form
{
object o = new object();
public Form1()
{
InitializeComponent();
Task t = new Task(foo);
t.Start();
Thread.Sleep(500);
Monitor.Enter(o);
}
private void foo()
{
Monitor.Enter(o);
Thread.Sleep(1000);
ActionOnUI();
Console.WriteLine("Thread End");
Monitor.Exit(o);
}
delegate void ActionOnUICrossThread();
public void ActionOnUI()
{
if (InvokeRequired)
{
this.BeginInvoke(new ActionOnUICrossThread(ActionOnUI));
}
else
{
textBox1.Text += "ab";
}
}
}
Я использовал thread.sleep, чтобы остановить mainThread на Monitor во время выполнения задачи.С точкой останова if (InvokeRequired) я вижу, что InvokeRequired имеет значение false, я ожидал, что это будет true.
Если я удаляю Thread.Sleep (500);Monitor.Enter (о);в форме Form1 ctor InvokeRequired имеет значение true, как я и ожидал.
почему существует такое разное поведение?