C#

从另一个线程写入TextBox?

发布于 2021-02-02 15:57:15

我无法弄清楚如何使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);
        }
    }
}
关注者
0
被浏览
110
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    在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。

    完整样本

    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);
            }
        }
    }
    


推荐阅读
知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看