首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多线程,访问UI控件

多线程,访问UI控件
EN

Stack Overflow用户
提问于 2012-01-08 03:32:47
回答 2查看 1.8K关注 0票数 3

我有一个简单的应用程序与常见的UI线程和后台工作者,在后台工作者,我需要动态创建LinkLabels,并将它们放在一个FlowLayoutPanel。为此,我需要将LinkLabel的父级设置为FlowLayoutPanel。

这是我目前拥有的一段代码,但是,我在'l.Parent =panel‘行得到了臭名昭著的“跨线程操作无效”;

我是多线程操作的新手,但我认为我的调用是正确的,但显然不是。有什么建议吗?

代码语言:javascript
复制
LinkLabel l = new LinkLabel();
if (rssFeedPanel.InvokeRequired) {
    FlowLayoutPanel panel = null;
    rssFeedPanel.Invoke(new MethodInvoker(delegate { panel = rssFeedPanel; }));
    l.Parent = panel;
}
else
    l.Parent = rssFeedPanel;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-08 03:34:22

您需要在另一个线程上实际设置Parent属性。

代码语言:javascript
复制
LinkLabel l = new LinkLabel();
if (rssFeedPanel.InvokeRequired) {
    rssFeedPanel.Invoke(new MethodInvoker(delegate {
        l.Parent = rssFeedPanel;
    }));
}
else
    l.Parent = rssFeedPanel;

通常,几乎任何涉及访问UI控件成员的操作都只能从UI线程完成。一些明显的例外是InvokeInvokeRequiredBeginInvokeBackgroundWorker类的一些方法。

如果您希望在这种情况下使用Invoke,也可以使用BeginInvoke

票数 3
EN

Stack Overflow用户

发布于 2012-01-08 03:39:45

我建议您将您的逻辑放在一个方法中,首先检查是否为InvokeRequired,然后在Invoke中调用该方法,否则直接调用它。

代码语言:javascript
复制
if (rssFeedPanel.InvokeRequired) {
    rssFeedPanel.Invoke(new MethodInvoker(delegate 
    { 
        AddLabel();
    }));
}
else AddLabel();

并将您的逻辑放在AddLabel方法中:

代码语言:javascript
复制
private void AddLabel()
{
    LinkLabel l = new LinkLabel();
    l.Parent = rssFeedPanel;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8772423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档