从另一个不起作用的线程C#AppendText到TextBox

时间:2012-07-22 19:12:11

标签: c# multithreading user-interface textbox appendtext

我的文本框出了问题 我有一个表示GUI线程的类和一个用于执行某些网络工作的工作线程的类,然后必须将日志添加到GUI线程中的文本框中,以便您可以看到后台发生的情况。
但是,我遇到的问题是GUI上没有任何反应,只有调用addLine()的调试信息才会出现在控制台中。
应该添加日志的方法addLine()被调用,但看起来AppendText()似乎什么都不做 我很确定这必须与线程有关,但我不确定如何解决这个问题。

以下是代码:

工作人员主题:

    Form1 form = new Form1();
    // This method gets called in the worker thread when a new log is available
    private void HandleMessage(Log args)
    {
        // Using an instance of my form and calling the function addLine()
        form.addLine(args.Message);
    }

GUI线程:

    // This method gets called from the worker thread
    public void addLine(String line)
    {
        // Outputting debug information to the console to see if the function gets called, it does get called
        Console.WriteLine("addLine called: " + line);
        // Trying to append text to the textbox, console is the textbox variable
        // This pretty much does nothing from the worker thread
        // Accessing it from the GUI thread works just fine
        console.AppendText("\r\n" + line);

        // Scrolling to the end
        console.SelectionStart = console.Text.Length;
        console.ScrollToCaret();
    }

我已尝试做一些Invoke的东西,但未能正确使用它 GUI要么自己锁定,要么继续无所事事。

1 个答案:

答案 0 :(得分:8)

如果您不在UI线程上,则无法进入winforms UI。尝试:

console.Invoke((MethodInvoker)delegate {
    console.AppendText("\r\n" + line);

    console.SelectionStart = console.Text.Length;
    console.ScrollToCaret();
});

将把它撞到UI线程上。