3

我正在尝试使用线程,其中包括一个 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();
    }
 }

我该如何解决这个问题?

4

1 回答 1

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

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

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

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

于 2013-10-20T13:12:39.427 回答