轉帖|其它|編輯:郝浩|2011-04-02 13:27:55.000|閱讀 1151 次
概述:.NET 不允許在一個線程中直接訪問另一個線程創(chuàng)建的控件,會引發(fā)異常:線程間操作無效,從不是創(chuàng)建控件XXX的線程訪問它。本文以一個線程去改變另一個線程的 Label(lb_Name) 的 Text 屬性為例,實現(xiàn)不同線程間控件的訪問。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
.NET 不允許在一個線程中直接訪問另一個線程創(chuàng)建的控件,會引發(fā)異常:線程間操作無效,從不是創(chuàng)建控件XXX的線程訪問它。
Windows 窗體中的控件被綁定到特定的線程,不具備線程安全性。
如果從另一個線程調(diào)用控件的方法,那么必須使用控件的一個 Invoke 方法來將調(diào)用封送到適當?shù)木€程。
本文以一個線程去改變另一個線程的 Label(lb_Name) 的 Text 屬性為例,實現(xiàn)不同線程間控件的訪問。
1:聲明一個委托,方法簽名為一個 string
public delegate void SetText(string text);
2:定義一個方法,用來改變 Lbale 的 Text,不同線程都可以調(diào)用,此方法可以帶上參數(shù),就可以不用匿名方法了,委托方法就是此方法
/// <summary>
/// Invoke 方式訪問控件,判斷控件是不是當前線程所創(chuàng)建
/// </summary>
private void SetLbText()
{
// 如果返回 True ,則訪問控件的線程不是創(chuàng)建控件的線程
if (lb_Name.InvokeRequired)
{
// 實例一個委托,匿名方法,
SetText st = new SetText(delegate(string text)
{
// 改變 Label 的 Text
lb_Name.Text = text;
});
// 把調(diào)用權交給創(chuàng)建控件的線程,帶上參數(shù)
lb_Name.Invoke(st, "我是另一個線程---Invoke 方式");
}
else
{
lb_Name.Text = "此控件是我創(chuàng)建的---Invoke 方式";
}
}
3:新開一個線程,執(zhí)行以上方法:
Thread t = new Thread(new ThreadStart(SetLbText));
t.Start();
4:直接訪問,將訪問失?。?/p>
// 新開一個線程,使用 ThreadStart 委托,匿名方法
Thread t = new Thread(new ThreadStart(delegate()
{
// 直接調(diào)用
try
{
lb_Name.Text = "我是另一個線程";
}
catch (Exception ex)
{
// 不同線程間,無法訪問
MessageBox.Show(ex.Message);
}
}));
//啟動線程
t.Start();
本站文章除注明轉載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@ke049m.cn
文章轉載自:博客園