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