簡體   English   中英

線程和匿名方法中的代理-更新新線程中的控件

[英]Delegates in Threads and Anonymous methods - Update controls in new Thread

我在窗口窗體中使用了多線程。 以下是我的課程。 我的設計器中有一個標簽控件,在新創建的線程下,我正在更新它的text屬性。

以下是將函數“ UpdateLabel”封裝在委托“ Del”中的情況。 而且效果很好。

public partial class DynamicType : Form
    {
        delegate void Del(String x);

        public DynamicType()
        {
            InitializeComponent();
        }

        private void DynamicType_Load(object sender, EventArgs e)
        {
            System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(StartThread));
            t.Start();
        }

        private void StartThread()
        {
            this.Invoke(new Del(UpdateLabel), new object[] { "Hi" });
        }

        private void UpdateLabel(String str)
        {
            label1.Text = str;
        }
    }

我還有另一種情況,叫做匿名方法。 在以下方法中實現匿名方法時。 以下是定義。

private void StartThread()
        {
            UpdateLabel("Hi");
        }



private void UpdateLabel(String str)
        {
            Del Label = delegate(String k)
             {
                 label1.Text = k;

             };
            Label("hi");
        }

跨線程操作無效:從創建該線程的線程以外的線程訪問控件“ label1”。

我的查詢是在以前使用委托的情況下進行的,它工作正常,在使用匿名方法的情況下,我通過直接實例化委托來刪除了多余的功能,並嘗試更新標簽控件文本屬性,從而導致如上所述的崩潰。 原因?

在第一個示例中,您正在UI線程中(通過Form.Invoke )調用標簽更新。 這是正確的並且有效:

this.Invoke(new Del(UpdateLabel), new object[] { "Hi" });

在第二個示例中,您將在后台線程中創建一個委托,並在后台線程中啟動該委托 那是行不通的,因為不允許后台線程更新UI:

Del Label = delegate(String k) { label1.Text = k; }; 
Label("hi");   // runs in the same thread

為了解決這個問題,您必須使用this.Invoke在UI線程中執行委托:

Del Label = delegate(String k) { label1.Text = k; }; 
this.Invoke(Label, new object[] {"hi"});   // runs in the UI thread

暫無
暫無

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

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