我有一个简单的应用程序与通常的UI线程和后台工作人员,我需要动态创建LinkLabels并将它们放在FlowLayoutPanel中的后台工作。为了做到这一点,我需要将LinkLabel的父级设置为FlowLayoutPanel。多线程,访问UI控件
这是我现在有的代码片段,但是,我得到了'l.Parent = panel'这一行中臭名昭着的“跨线程操作无效”
我对多线程操作相当陌生,但我认为我做了正确的调用,但显然不是。有什么建议么?
LinkLabel l = new LinkLabel();
if (rssFeedPanel.InvokeRequired) {
FlowLayoutPanel panel = null;
rssFeedPanel.Invoke(new MethodInvoker(delegate { panel = rssFeedPanel; }));
l.Parent = panel;
}
else
l.Parent = rssFeedPanel;
感谢您的帮助! – Hammy 2012-01-07 23:05:54
只是好奇,你不能使用'if(Dispatcher.Thread == Thread.CurrentThread)'并调用Dispatcher.BeginInvoke(new EventHandler())来调用所有控件,而不是检查每个控件是否有InvokeRequired控制?只是一个大脑放屁,但如果可以的话,我很确定它有点快。 (需要你开启一个事件或者通过'EventArgs'传递这些东西,但这很简单) –
aevitas
2012-01-08 00:54:08
'Dispatcher.Thread'是非静态的,所以你需要UI线程的实例。至于速度更快,我怀疑它。从看代码我敢打赌,如果控制窗口已经创建,它就差不多了。如果窗口还没有创建,我敢打赌'Control.InvokeRequired'更快。 – 2012-01-08 01:19:28