从另一个线程另一个类执行对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..这是我做错了什么的问题吗请帮助! !
你不能直接从另一个线程对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线程进行评估。