簡體   English   中英

當一個對象成為syncronizationContext的屬性時?

[英]When an object becomes a property of syncronizationContext?

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

為什么會有這種不同的行為?

Task不是線程。 它僅表示異步操作。 任務調度程序可以將其放在線程上或保留在同一線程上。

因為您要通過Monitor.Enter(o);阻止表單構造Monitor.Enter(o); 內部構造函數,該結構總是會失去對Monitor.Enter(o);爭用條件Monitor.Enter(o); foo內部由於500毫秒的睡眠時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM