总的来说,我对 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(使用前将#替换为@)