我有一个简单的应用程序,其中包含常规UI线程和后台工作器,在后台工作器中,我需要动态创建LinkLabels并将它们放置在FlowLayoutPanel中。为了做到这一点,我需要将LinkLabel的父级设置为FlowLayoutPanel。
以下是我目前拥有的代码片段,但是我在“l.Parent = panel;”这一行上得到了臭名昭著的“跨线程操作无效”。
我对多线程操作相当新,但我认为我正确地执行了调用,但显然没有。 有什么建议吗?
以下是我目前拥有的代码片段,但是我在“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;
if (Dispatcher.Thread == Thread.CurrentThread)
并调用Dispatcher.BeginInvoke(new EventHandler<T>())
来调用所有控件,而不是为每个控件检查InvokeRequired
吗?只是一个脑抽,但如果可以的话,我相信它会快一点。(需要触发事件或其他什么东西,并通过EventArgs
传递内容,但这很简单) - aevitasDispatcher.Thread
不是静态的,所以你需要 UI 线程的实例。至于速度更快,我表示怀疑。从代码上看,如果控制窗口已经被创建,我敢打赌它的速度大致相同。如果窗口尚未被创建,我敢打赌Control.InvokeRequired
会更快。 - Dark Falcon