【发布时间】:2015-06-08 06:16:41
【问题描述】:
我有一个表单 (MainPage),我有时在其中设置了一个 UserControl,所以我在该表单中编写了一个这样的方法来调用:
delegate void containerPanelCallback(UIPart uiPart);
public void IncludeUIPart(UIPart uiPart)
{
if (this.containerPanel.InvokeRequired)
{
containerPanelCallback d = new containerPanelCallback(IncludeUIPart);
containerPanel.Invoke(d, new object[] { uiPart });
}
else
{
containerPanel.Controls.Clear();
containerPanel.Controls.Add(uiPart);
}
uiPart.Size = this.containerPanel.Size;
uiPart.Dock = DockStyle.Fill;
}
UIPart 类继承自 UserControl,而我的 UserControls 继承自 UIPart。
这个方法和调用是这样启动的:
public class myClass
{
...
private static MainPage _frmMain;
private static myUIPart6 UIP6;
...
public static void aMethod(/* Some arguments */)
{
UIP6 = new myUIPart6 { /* Some settings of properties */ };
_frmMain.IncludeUIPart(UIP6);
_frmMain.Show(); /*Throws an error*/
}
...
}
错误是:
跨线程操作无效:控件“MainPage”从创建它的线程以外的线程访问。
我在这里找到了很多关于这个错误的问题和答案,但我不明白为什么它会抛出_frmMain.Show();?,我应该调用别的东西吗?还是我走错路了?它与创建我的 UserControl 的句柄有关吗?
【问题讨论】:
-
你怎么称呼
aMethod? -
Invoke() 必须在非主线程执行 UI 时调用任何/所有操作。在您的示例中,您在调用 IncludeUIPart() 时使用 Invoke on,但在调用 _frmMain.Show 时不使用 Invoke()。尝试将整个 aMethod 包装在 Invoke() 中并从 IncludeUIPart() 中删除 Invoke 调用
-
我认为您在 2000 年初作为开发人员以及您的笑话 ;)
-
所以你不应该拿严肃的事情开玩笑;)
-
@HamletHakobyan 我有一个
Send线程调用aMethod();)。
标签: c# multithreading winforms