首先來看下面代碼
主線程
delegate void SetTextCallback(string text)
private void SetText(string text)
{
if (this
textBox
InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText)
this
Invoke(d
new object[] { text })
}
else
{
this
textBox
Text = text;
}
}
private void BtnMainThread_Click(object sender
EventArgs e) //主線程調用textBox
{
this
textBox
Text =
Main Thread
;
}
子線程
private void BtnNewThread_Click(object sender
EventArgs e) //子線程調用textBox
{
this
demoThread = new Thread(new ThreadStart(this
NewThreadSet))
this
demoThread
Start()
}
private void NewThreadSet()
{
this
SetText(
New Thread
)
}
首先需要對
this
textBox
InvokeRequired
返回值的解釋
當主線程調用其所在的方法時返回
False
當子線程調用其所在的方法時返回
True
當單擊
主線程調用textBox
時
this
textBox
InvokeRequired
的返回值為
False
直接執行
else
的代碼
textBox
中顯示
Main Thread
當單擊
子線程調用textBox
時
this
textBox
InvokeRequired
的返回值為
True
執行
SetTextCallback d = new SetTextCallback(SetText)
this
Invoke(d
new object[] { text })
這兩句代碼
其中Invoke的作用是
在擁有控件的基礎窗口句柄的線程上
用指定的參數列表執行指定委托
a
在擁有控件的基礎窗口句柄的線程上
就是指主線程
b
指定的參數列表
是指的參數
text
c
指定委托
是指
SetText
方法
這樣就很容易看出
代碼執行到
Invoke
後就會把子線程的參數
New Thread
交給主線程去執行
SetText
方法
此時由於是主線程調用SetText方法
所以this
textBox
InvokeRequired的返回值為False
直接執行else的代碼
textBox
中顯示
New Thread
From:http://tw.wingwit.com/Article/program/net/201311/12241.html