Когда объект становится свойством syncronizationContext? - PullRequest
0 голосов
/ 15 февраля 2019

Я написал этот код, начиная с нового проекта 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, как я и ожидал.

почему существует такое разное поведение?

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Поскольку вы блокируете конструкцию формы с помощью Monitor.Enter(o); внутри конструктора, который всегда теряет условия гонки до Monitor.Enter(o); внутри foo из-за 500 мс сна.

0 голосов
/ 15 февраля 2019

Task это не нить.Это просто представляет асинхронную операцию.Планировщик задач может поместить его в поток или оставить в том же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...