从另一个线程另一个类执行对Richtext框的操作

本文关键字:另一个 操作 Richtext 执行 线程 | 更新日期: 2023-09-27 18:06:21

我在操作另一个类的richtextbox时遇到问题

我使用backgroundworker类将GUI线程与计算线程分开

这是我需要从其他类

调用的函数
public void UpdateRTB(String strText, Color colVar)
    {
        if (InputBox.InvokeRequired)
        {
            InputBox.Invoke(new UpdateRTBCallback(this.UpdateRTB), new object[] { strText, colVar });
        }
        else
        {
            InputBox.Select(InputBox.Text.IndexOf(strText), strText.Length);
            InputBox.SelectionColor = colVar;
            InputBox.Update();
        }
    }

变量objForm1是表单初始化后声明的变量

objForm1 = this;

返回表单的函数是

public static Form1 GetThisForm()
    {
        return objForm1;
    }

这是全局声明的委托

public delegate void UpdateRTBCallback(String strText, Color strColor);

这是我在另一个类中写的代码,叫做

Form1 form1 = Form1.GetThisForm();
form1.UpdateRTB(item, Color.Yellow);

在objForm1,当我调试我看到它的字段显示System.InvalidOperationException..这是我做错了什么的问题吗请帮助! !

从另一个线程另一个类执行对Richtext框的操作

你不能直接从另一个线程对gui线程进行操作,你需要检查invokerrequirequired并调用如果从另一个线程调用gui线程上的方法。在您的gui类中实现您期望从其他线程调用的方法,使用invokerrequiredd来检查您是否需要调用gui线程上的操作或照常继续。这里有很多关于这个主题的信息。下面是一个很短的演示:

if (this.InvokeRequired) { 
  // called from non-gui thread, use invoke to delegate the action to the gui thread
    MyCallBack callback = new MyCallBack(myCallBack); 
    this.Invoke(callback, params); 
} else { 
   // called from gui thread, do your thing as normal
} 

好吧,我猜还有第二种可能的情况。参考你的表单得到设置后的初始化形式,所以我猜这是在你的表单构造函数(我希望它是后的 InitializeComponent()根据WinForms指南..)。返回引用的函数是静态的,这意味着引用也必须是静态的,这意味着您可以在调用表单的构造函数和设置引用之前查看它。这里我必须补充一点,你没有告诉我们在哪里访问引用(从窗体构造之前运行的(静态)函数?)

无论如何,这里有一些替代方案,我希望将是一个有用的答案/选项给你->而不是写你自己的,你可能想看看这些有用的助手属性,似乎已经做什么你需要的形式。ActiveForm或Application.OpenForms.

PS:系统。InvalidOperation可能会出现在表单的字段中,因为它们也正在从另一个(调试)线程而不是UI线程进行评估。