作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
如何从运行不同类的新线程更新主线程中的文本框和标签。
MainForm.cs(主线程)
public partial class MainForm : Form
{
public MainForm()
{
Test t = new Test();
Thread testThread = new Thread(new ThreadStart(t.HelloWorld));
testThread.IsBackground = true;
testThread.Start();
}
private void UpdateTextBox(string text)
{
textBox1.AppendText(text + "\r\n");
}
}
public class Test
{
public void HelloWorld()
{
MainForm.UpdateTextBox("Hello World");
// How do I execute this on the main thread ???
}
}
我看过此处的示例,但似乎无法正确理解。请有人可以提供一些好的链接。
我重新开始了,所以我不会弄乱我的代码。如果有人想用我的示例举一个工作示例,那就太好了。
此外,如果我必须更新多个对象,如文本框和标签等(不是同时全部),最好的方法是什么,每个文本框都有一个方法,或者有没有办法用一种方法?
最佳答案
Invoke 或 BeginInvoke,例如
Invoke((MethodInvoker)delegate {
MainForm.UpdateTextBox("Hello World");
});
@tiptopjones 我猜你也在问如何获取对表单的引用。您可以使 HelloWorld 方法采用对象参数,使用 ParameterizedThreadStart 委托(delegate),然后将对表单的引用作为参数传递给 Thread.Start 方法。但我建议阅读匿名方法,这会使它变得容易得多,并保持所有内容都是强类型的。
public class MainForm : Form {
public MainForm() {
Test t = new Test();
Thread testThread = new Thread((ThreadStart)delegate { t.HelloWorld(this); });
testThread.IsBackground = true;
testThread.Start();
}
public void UpdateTextBox(string text) {
Invoke((MethodInvoker)delegate {
textBox1.AppendText(text + "\r\n");
});
}
}
public class Test {
public void HelloWorld(MainForm form) {
form.UpdateTextBox("Hello World");
}
}
当你对它感到满意时,你可以阅读 lambda 表达式并像这样做:
Thread testThread = new Thread(() => t.HelloWorld(this));
关于c# - 如何从另一个线程更新主线程中的文本框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4446048/
我是一名优秀的程序员,十分优秀!