【问题标题】:Performing Operation on Richtext box from another thread another class从另一个线程另一个类对富文本框执行操作
【发布时间】:2011-08-23 13:08:32
【问题描述】:

在其他类的 Richtextbox 上操作时遇到问题

m 使用 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);

这是m写在另一个类中调用它的代码

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

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

【问题讨论】:

  • @msirwani : 7 个问题已选择 0 个答案。希望您知道 stackOverflow 为您提供了选择答案的功能。
  • 我也有类似的问题...有什么建议吗?

标签: c# winforms multithreading


【解决方案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
} 

【讨论】:

    【解决方案2】:

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

    无论如何,这里有一些替代方案,我希望这对你来说是一个有用的答案/选项 -> 你可能想看看这些有用的帮助属性,而不是自己写,这些属性似乎已经做了你需要的@ 987654321@或Application.OpenForms

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

    【讨论】:

      猜你喜欢
      • 2018-03-10
      • 1970-01-01
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多