我正在尝试使用线程并且包含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();
}
}
我该如何解决这个问题?
答案 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。