我无法弄清楚如何使C#Windows Form应用程序从线程写入文本框。例如在Program.cs中,我们具有绘制以下形式的标准main():
static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); }
然后在Form1.cs中:
public Form1() { InitializeComponent(); new Thread(SampleFunction).Start(); } public static void SampleFunction() { while(true) WindowsFormsApplication1.Form1.ActiveForm.Text += "hi. "; }
我要彻底解决这个问题吗?
更新
这是bendewey提供的工作代码示例:
public partial class Form1 : Form { public Form1() { InitializeComponent(); new Thread(SampleFunction).Start(); } public void AppendTextBox(string value) { if (InvokeRequired) { this.Invoke(new Action<string>(AppendTextBox), new object[] {value}); return; } textBox1.Text += value; } void SampleFunction() { // Gets executed on a seperate thread and // doesn't block the UI while sleeping for(int i = 0; i<5; i++) { AppendTextBox("hi. "); Thread.Sleep(1000); } } }
在MainForm上创建一个函数来设置文本框,以检查InvokeRequired
public void AppendTextBox(string value) { if (InvokeRequired) { this.Invoke(new Action<string>(AppendTextBox), new object[] {value}); return; } ActiveForm.Text += value; }
尽管您不能使用静态方法进行调用。
WindowsFormsApplication1.Form1.AppendTextBox("hi. ");
您必须在某处对Form1进行静态引用,但这并不是真正推荐或必需的方法,您是否可以仅使SampleFunction不是静态的,如果可以,则可以调用
AppendTextBox("hi. ");
它将附加在不同的线程上,并在需要时使用Invoke调用将其编组到UI。
完整样本