gpt4 book ai didi

c# - 如何从另一个线程更新主线程中的文本框?

转载 作者:太空狗 更新时间:2023-10-29 22:24:31 24 4
gpt4 key购买 nike

如何从运行不同类的新线程更新主线程中的文本框和标签。

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com