首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >自动化InvokeRequired代码模式

自动化InvokeRequired代码模式
EN

Stack Overflow用户
提问于 2010-03-03 07:29:10
回答 7查看 155.5K关注 0票数 197
代码语言:javascript
运行
复制
private void DoGUISwitch() {
    // cruisin for a bruisin' through exception city
    object1.Visible = true;
    object2.Visible = false;
}

变成:

代码语言:javascript
运行
复制
private void DoGUISwitch() {
    if (object1.InvokeRequired) {
        object1.Invoke(new MethodInvoker(() => { DoGUISwitch(); }));
    } else {
        object1.Visible = true;
        object2.Visible = false;
    }
}

这在C#中是一个笨拙的模式,无论是记忆还是键入都是如此。有没有人想出了某种捷径或构造,可以在一定程度上自动化这一点?如果有一种方法可以将函数附加到执行此检查的对象上,而不必执行所有这些额外的工作,比如object1.InvokeIfNecessary.visible = true类型的快捷方式,那就太酷了。

以前的answers已经讨论了每次只调用Invoke()的不切实际,即使这样,Invoke()语法也是低效的,而且处理起来仍然很笨拙。

那么,有没有人想出什么捷径呢?

EN

Stack Overflow用户

发布于 2017-10-02 12:13:08

用法:

代码语言:javascript
运行
复制
control.InvokeIfRequired(c => c.Visible = false);

return control.InvokeIfRequired(c => {
    c.Visible = value

    return c.Visible;
});

代码:

代码语言:javascript
运行
复制
using System;
using System.ComponentModel;

namespace Extensions
{
    public static class SynchronizeInvokeExtensions
    {
        public static void InvokeIfRequired<T>(this T obj, Action<T> action)
            where T : ISynchronizeInvoke
        {
            if (obj.InvokeRequired)
            {
                obj.Invoke(action, new object[] { obj });
            }
            else
            {
                action(obj);
            }
        }

        public static TOut InvokeIfRequired<TIn, TOut>(this TIn obj, Func<TIn, TOut> func) 
            where TIn : ISynchronizeInvoke
        {
            return obj.InvokeRequired
                ? (TOut)obj.Invoke(func, new object[] { obj })
                : func(obj);
        }
    }
}
票数 5
EN
查看全部 7 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2367718

复制
相关文章

相似问题

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