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