首先来看下面代码
主线程
delegate void SetTextCallback(string text)
private void SetText(string text)
{
if (thistextBoxInvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText)
thisInvoke(d new object[] { text })
}
else
{
thistextBoxText = text;
}
}
private void BtnMainThread_Click(object sender EventArgs e) //主线程调用textBox
{
thistextBoxText = Main Thread;
}
子线程
private void BtnNewThread_Click(object sender EventArgs e) //子线程调用textBox
{
thisdemoThread = new Thread(new ThreadStart(thisNewThreadSet))
thisdemoThreadStart()
}
private void NewThreadSet()
{
thisSetText(New Thread)
}
首先需要对thistextBoxInvokeRequired返回值的解释
当主线程调用其所在的方法时返回False
当子线程调用其所在的方法时返回True
当单击主线程调用textBox时
thistextBoxInvokeRequired的返回值为False
直接执行else的代码textBox中显示Main Thread
当单击子线程调用textBox时
thistextBoxInvokeRequired的返回值为True
执行
SetTextCallback d = new SetTextCallback(SetText)
thisInvoke(d new object[] { text })
这两句代码其中Invoke的作用是在拥有控件的基础窗口句柄的线程上用指定的参数列表执行指定委托
a 在拥有控件的基础窗口句柄的线程上就是指主线程
b 指定的参数列表是指的参数text
c 指定委托是指SetText方法
这样就很容易看出
代码执行到Invoke后就会把子线程的参数 New Thread 交给主线程去执行SetText方法此时由于是主线程调用SetText方法所以thistextBoxInvokeRequired的返回值为False直接执行else的代码textBox中显示New Thread