[英]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.