我从新的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来停止Monitor上的mainThread。 在if(InvokeRequired)断点的情况下,我可以看到InvokeRequired为false,我希望它为true。
如果我删除Thread.Sleep(500); Monitor.Enter(o);如我所料,在Form1 ctor上,InvokeRequired为true。
为什么会有这种不同的行为?
答案 0 :(得分:0)
Task
不是线程。它仅表示异步操作。任务调度程序可以将其置于线程中或保留在同一线程中。
答案 1 :(得分:0)
因为您要阻止Monitor.Enter(o);
内的构造函数构造函数,该构造函数由于休眠500毫秒而始终失去Monitor.Enter(o);
内foo
的竞争条件。