不能调用非委托类型

本文关键字:类型 调用 不能 | 更新日期: 2023-09-27 18:36:03

我正在尝试使用线程,其中包括一个 GUI 控制器,所以我需要调用该控制器,但我有这个问题 - 我无法在代码的这一部分中调用非委托类型

if (toolStripTextBox1.Text != "")
{
    if (RT[j].tabvalue.ToString() == tabControl1.Invoke(() =>
                                       { tabControl1.SelectedTab.Name; }))
    {
        RT[j].RitchT.Text = getH.getHtmlCode(toolStripTextBox1.Text);
    }
}

另一方面,虽然这是有效的

tabControl1.Invoke(
    () => { tabControl1.TabPages[R.RitchT.Name].Controls.Add(R.RitchT);
});

这是调用类

 public static class ControlExtensions
 {
    public static void Invoke(this Control control, Action action)
    {
        if (control.InvokeRequired)
            control.Invoke(new MethodInvoker(action), null);
        else
            action.Invoke();
    }
 }

我该如何解决这个问题?

不能调用非委托类型

  tabControl1.Invoke(() => { tabControl1.SelectedTab.Name; })

是的,这不是合法语法。 Control.BeginInvoke() 方法将 Delegate 作为其第一个参数。 lambda 表达式不会隐式转换为委托,您必须提供帮助。 修复:

  tabControl1.Invoke(new Func<string>(() => { return tabControl1.SelectedTab.Name; }))

你会有更多的麻烦,你不能在工作线程中分配 RichTextBox 的 Text 属性,你也必须在那里使用 BeginInvoke()。 您将侥幸阅读 Text 属性,但这是一个坏主意,它们可能会在工作线程运行时更改,并且用户继续操作 UI。 您确实希望支持后台工作线程或任务,在启动工作线程之前收集工作线程所需的数据,在完成后使用工作线程的结果更新 UI。