不能调用非委托类型
本文关键字:类型 调用 不能 | 更新日期: 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。