从另一个线程另一个类在Richtext框上执行操作

时间:2011-08-23 13:08:33

标签: c# winforms multithreading

在从另一个类操作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 ..这是我做错了什么的问题 请帮忙!!!

2 个答案:

答案 0 :(得分:1)

你不能直接从另一个线程操作gui线程,你需要检查InvokeRequired并调用如果从另一个线程调用gui线程上的方法。在你的gui类实现方法中,你期望从其他线程使用InvokeRequired调用,以检查是否需要在gui线程上调用操作或继续正常。这个主题有很多信息here。这是一个非常简短的演示:

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
} 

答案 1 :(得分:0)

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

无论如何,这里有一些替代方案我希望对你有用的答案/选项 - >您可能希望查看这些有用的帮助程序属性,而不是编写自己的帮助程序属性,这些属性似乎已经执行了您需要的Form.ActiveFormApplication.OpenForms

PS:System.InvalidOperation可能会显示您的表单的字段,因为它们也是从另一个(调试)线程评估而不是UI线程。