首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >需要InvokeRequired吗?

需要InvokeRequired吗?
EN

Stack Overflow用户
提问于 2014-06-13 06:57:29
回答 4查看 3.7K关注 0票数 2

我的同事喜欢这样做

代码语言:javascript
运行
复制
if (!listbox1.InvokeRequired)
    listbox1.Items.Add(Container.error_message);
else
    listbox1.Invoke((MethodInvoker)delegate
    {
        listbox1.Items.Add(Container.error_message);
    });

他为什么要查InvokedRequired?只使用这句话会更好吗?

代码语言:javascript
运行
复制
    listbox1.Invoke((MethodInvoker)delegate
    {
        listbox1.Items.Add(Container.error_message);
    });
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-06-13 07:01:05

如果您确信某个特定的路由只能通过回调线程到达,那么我倾向于同意您的意见--这并不是为了避免Invoke,而是为了避免任何重复。如果可以从多个路由到达路径,则最好进行检查以避免非线程情况下的任何开销,但是:重构使每个代码路径都知道自己正在做什么(只调用实用方法)可能更好,即UI线程只调用Foo(),因为工作线程使用Invoke / MethodInvoker调用Foo()

票数 5
EN

Stack Overflow用户

发布于 2014-06-13 06:59:21

如果您确信该方法将从非GUI线程调用,那么使用InvokeRequired就没有意义了。

此外,您可以将该listbox1.Items.Add(Container.error_message);放入一个方法中(不要重复)。该方法可以在不需要InvokeRequired的情况下从GUI调用,也可以通过从后台线程调用来调用。

最后,(如果有的话)通常的模式是这样的:

代码语言:javascript
运行
复制
void AddMessageToListBox(String message)
{
    if (listbox1.InvokeRequired)
    {
        listbox1.Invoke((Action<String>)AddMessageToListBox, message);
        return;
    }

    listbox1.Items.Add(message);
}
票数 2
EN

Stack Overflow用户

发布于 2014-06-13 07:04:29

InvokeRequired检查使代码在由GUI线程(执行第一个if块)运行时和由非GUI线程(块的第二部分)运行时都能工作。

它看上去有点复杂,但是如果按照设计,代码可以由任何一个线程运行,那么至少Invoke是必要的。据我所知,您可以选择只按照您的建议使用Invoke,它在由GUI线程运行时也能工作,但它的效率可能略低一些。您可能会认为这是微观优化,但我建议您简单地测试在这两种情况下发生的事情以及它所消耗的时间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24199412

复制
相关文章

相似问题

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