无法调用非委托类型

时间:2013-10-20 13:08:30

标签: c# invoke

我正在尝试使用线程并且包含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();
    }
 }

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

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

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

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

你会遇到更多麻烦,你不能在工作线程中分配RichTextBox的Text属性,你也必须在那里使用BeginInvoke()。您将阅读Text属性,但这是一个坏主意,它们可能会在工作线程运行且用户继续操作UI时发生变化。您真的想要支持BackgroundWorker或Task,在启动之前收集工作人员所需的数据,在工作完成后用工作结果更新UI。