当一个对象成为syncronizationContext的属性时?

时间:2019-02-15 15:12:02

标签: c# winforms

我从新的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。

为什么会有这种不同的行为?

2 个答案:

答案 0 :(得分:0)

Task不是线程。它仅表示异步操作。任务调度程序可以将其置于线程中或保留在同一线程中。

答案 1 :(得分:0)

因为您要阻止Monitor.Enter(o);内的构造函数构造函数,该构造函数由于休眠500毫秒而始终失去Monitor.Enter(o);foo的竞争条件。