C# 跨线程调用TextBox方法浅析
2010-05-14 12:26
465 查看
首先来看下面代码:
主线程:
子线程:
1.首先需要对“this.textBox1.InvokeRequired”返回值的解释:
当主线程调用其所在的方法时返回“False”,
当子线程调用其所在的方法时返回“True”。
2.当单击"主线程调用textBox1"时,
"this.textBox1.InvokeRequired"的返回值为"False",
直接执行"else"的代码,"textBox1"中显示“Main Thread”;
3.当单击"子线程调用textBox1"时,
"this.textBox1.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.textBox1.InvokeRequired的返回值为False,直接执行else的代码,textBox1中显示“New Thread”。
主线程:
delegate void SetTextCallback(string text); private void SetText(string text) { if (this.textBox1.InvokeRequired) { SetTextCallback d = new SetTextCallback(SetText); this.Invoke(d, new object[] { text }); } else { this.textBox1.Text = text; } } private void BtnMainThread_Click(object sender, EventArgs e) //主线程调用textBox1 { this.textBox1.Text = "Main Thread"; } |
private void BtnNewThread_Click(object sender, EventArgs e) //子线程调用textBox1 { this.demoThread = new Thread(new ThreadStart(this.NewThreadSet)); this.demoThread.Start(); } private void NewThreadSet() { this.SetText("New Thread"); } |
当主线程调用其所在的方法时返回“False”,
当子线程调用其所在的方法时返回“True”。
2.当单击"主线程调用textBox1"时,
"this.textBox1.InvokeRequired"的返回值为"False",
直接执行"else"的代码,"textBox1"中显示“Main Thread”;
3.当单击"子线程调用textBox1"时,
"this.textBox1.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.textBox1.InvokeRequired的返回值为False,直接执行else的代码,textBox1中显示“New Thread”。
相关文章推荐
- C# 跨线程调用TextBox方法浅析
- [转载]C# 跨线程调用TextBox方法浅析
- C#线程进程总结(线程调用带参数的方法)
- C#线程调用带参数的方法
- c#利用委托跨线程调用UI控件完整使用方法
- 转----C#线程调用带参数的方法 ~
- C#线程调用带参数的方法
- C#线程调用带参数的方法 ~
- C#中用Invoke调用控件方法和BeginInvoke线程使用方法
- C# 在工作线程中调用主线程中的方法
- C# 用户控件调用主窗体的方法(简单的线程用法)
- C#中添加三个线程同时启动执行某一方法,并依次调用某方法中的循环打印输。
- 转:C#线程调用带参数的方法
- C# 子线程调用主线程窗体的解决方法
- C# 子线程调用主线程窗体的解决方法
- c#带参数和返回值的函数 开启线程调用的方法
- 浅谈C#跨线程调用窗体控件(比如TextBox)引发的线程安全问题
- C#中用Invoke调用控件方法和BeginInvoke线程使用方法
- C#中添加三个线程同时启动执行某一方法,并依次调用某方法中的循环打印输。
- c# 线程间操作无效: 从不是创建控件“textBox1”的线程访问它。解决方法