線程間操作無效: 從不是創建控件“t1”的線程訪問它
開發時 經常會遇到上面的問題,原因常常是在新Thread中給窗體中的控件賦值。
爲了解決此問題,我們可以調用this.BeginInvoke(Delegate method);方法,this.表示窗體,當然可以用想要調用 的控件,比如Label,Button。
此方法的參數要求爲委託參數,我們可以使用
this.BeginInvoke(MethodInvoker)delegate(){//方法體})
來簡寫,
private void button1_Click(object sender, EventArgs e)
{
Thread t = new Thread(new ParameterizedThreadStart(test1));
t.Start(t1);
}
void test1(object label)
{
this.BeginInvoke((MethodInvoker)delegate()
{
(label as Label).Text = Thread.CurrentThread.ManagedThreadId.ToString();
});
//直接給控件賦值會引發異常
// (label as Label).Text = Thread.CurrentThread.ManagedThreadId.ToString();
}
當然這裏也可以調用Invoke方法,跟BeginInvoke的區別只是同步跟異步的區別而已。