当控制台输出重定向到文本框时,会发生跨线程操作[重复]

2023-12-03

总的来说,我对 C# 和 GUI 开发还很陌生。如果这是一个老问题,请引导我找到该来源,我将删除这个问题。

我的情况:因此,我正在编写一个 GUI,它将一个函数的控制台输出重定向到 Windows 应用程序表单中的文本框。控制台输出仅向用户显示信息,例如设备序列号、当前软件版本等。

我的问题:这个表格效果很好,只是更新软件的过程需要几分钟,这会冻结我的表格直到它完成。现在,我知道实施后台工作人员可以缓解这个问题。但是,当我实现后台工作程序时,我收到以下错误。

跨线程操作无效:从创建该控件的线程以外的线程访问控件“TextBox”。

我的代码摘要如下:

public class Form1 : Form
{
    this.backgroundWorker1.DoWork += new
    System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork);

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
         BackgroundWorker bw = sender as BackgroundWorker;     
         BigProcess(bw);
    }

    private void BigProcess(BackgroundWorker bw)
    {
        // lengthy operation that includes lots of
        Console.WriteLine("feedback stuff for the user");
    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.backgroundWorker1.RunWorkerAsync();
    }
}

在这个项目中我也有一堂课TextBoxStreamWriter源自StringWriter它负责为我重定向控制台输出。在TextBoxStreamWriter我正在重写WriteLine方法和Write方法。

这是我正在做的事情的一个例子:

public override void WriteLine(string value)
{
      base.WriteLine(DateTime.Now.ToString(value));
      textBoxOutput.AppendText(value.ToString() + Environment.NewLine);
      writer.Write(value);
}

调用此方法时会引发 InvalidOperationException。

我怎样才能使这个线程安全?任何帮助,将不胜感激。


您只需将对文本框的更新返回到 UI 线程 - 例如:

if (textBoxOutput.InvokeRequired)
{
  Invoke((MethodInvoker)(() => textBoxOutput.AppendText(value.ToString() + Environment.NewLine);
}
else
{
   textBoxOutput.AppendText(value.ToString() + Environment.NewLine)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当控制台输出重定向到文本框时,会发生跨线程操作[重复] 的相关文章

随机推荐