如何从DataReceivedEventHandler函数更新主窗体TextBox控件的文本内容?
实现方案
你需要通过窗体控件提供的线程封送能力,将UI更新操作调度到UI线程执行,具体修改如下:
- 移除
SortOutputHandler方法的static修饰符,确保方法可以访问窗体实例的控件和成员变量 - 在输出内容拼接完成后,判断文本框是否需要跨线程调用,若需要则通过
BeginInvoke将更新逻辑封送到UI线程执行
修改后的完整代码如下:
private void SortOutputHandler(object sendingProcess, DataReceivedEventArgs outLine) { // 收集sort命令输出 if (!String.IsNullOrEmpty(outLine.Data)) { numOutputLines++; string newLine = Environment.NewLine + $"[{numOutputLines}] - {outLine.Data}"; sortOutput.Append(newLine); // 处理UI更新逻辑 if (frmMain.txtBox1.InvokeRequired) { // 异步将更新操作调度到UI线程执行,不阻塞后台处理流程 frmMain.txtBox1.BeginInvoke(new Action(() => { frmMain.txtBox1.AppendText(newLine); // 如果需要替换全部文本而非追加,替换上面一行代码为: // frmMain.txtBox1.Text = sortOutput.ToString(); })); } else { // 当前已经处于UI线程,直接更新即可 frmMain.txtBox1.AppendText(newLine); } } }
补充说明
- 如果该方法定义在主窗体类内部,可直接用
this.txtBox1替代frmMain.txtBox1 - 若需要同步等待UI更新完成再继续后续逻辑,可将
BeginInvoke替换为Invoke - 方法改为非静态后,绑定
OutputDataReceived事件时需要用窗体实例的方法绑定,不可再用类名访问静态方法的形式绑定
内容的提问来源于stack exchange,提问作者electro
相关产品推荐
相关产品推荐

