如何编写 PostSharp Invoke 方面来简化跨线程控制更新

2023-12-09

当我想跨线程更新控件时,我通常会这样做:

this.Invoke((MethodInvoker)delegate { SomeProcedure(); });

建议的方法实际上是调用要更新的特定控件的调用程序,但 99% 的情况下,表单(即我的示例中的“this”)和控件将在同一台上创建所以为了简单起见,我真的很喜欢这样做。

我在想,如果我能在 SomeProcedure 之上添加一个 PostSharp 方面,将其包装在混乱的声明中,那就太好了。

然后去...(哦,是的,第一个可用答案可获得 100 分奖励:)


我以前没有在 WinForms 上编程过线程访问,但我已经用 PostSharp + Silverlight 完成了。因此,通过一些谷歌搜索,我会尝试一下。但不能保证它有效!

[Serializable]
public class OnGuiThreadAttribute : MethodInterceptionAspect
{
    private static Control MainControl;

    //or internal visibility if you prefer
    public static void RegisterMainControl(Control mainControl) 
    {
        MainControl = mainControl;
    }

    public override void OnInvoke(MethodInterceptionArgs eventArgs)
    {
        if (MainControl.InvokeRequired)
            MainControl.BeginInvoke(eventArgs.Proceed);
        else
            eventArgs.Proceed();
    }
}

这个想法是在应用程序开始时,使用属性注册您的主/根控件。然后任何你想确保在主线程上运行的方法,只需用[OnGuiThread]。如果它已经在主线程上,它只会运行该方法。如果不是,它将将该方法调用作为异步委托提升到主线程。

编辑:我刚刚发现(已经晚了)您要求对您正在使用的目标控件使用特定的调用方法。假设你装修instance控件子类的方法:

[Serializable]
public class OnGuiThreadAttribute : MethodInterceptionAspect
{
    public override void OnInvoke(MethodInterceptionArgs eventArgs)
    {
        //you may want to change this line to more gracefully check 
        //if "Instance" is a Control
        Control targetControl = (Control)eventArgs.Instance;

        if (targetControl.InvokeRequired)
            targetControl.BeginInvoke(eventArgs.Proceed);
        else
            eventArgs.Proceed();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何编写 PostSharp Invoke 方面来简化跨线程控制更新 的相关文章

随机推荐

  • 静态链接与动态链接

    在某些情况下 是否有任何令人信服的性能原因来选择静态链接而不是动态链接 反之亦然 我听过或读过以下内容 但我对这个主题的了解还不够 无法保证其真实性 1 静态链接和动态链接之间的运行时性能差异通常可以忽略不计 2 如果使用使用配置文件数据来
  • 为什么我的打印函数将 () 和 "" 与语句一起打印?

    这是我针对绝对初学者 Python 编程挑战的代码 food input What is your favorite entree dessert input What is your favorite dessert print nI a
  • 使用可变模板参数构建枚举

    我有一个相当简单的变体类 它支持一组预定义的类型 并提供一个枚举来指示哪些可用类型当前处于活动状态 像这样的事情 class variant enum class type integer real string etc type acti
  • Eclipse 2023-06 突然不再自动完成“sysout”

    虽然我认识到这个问题之前已经被问过 但我尝试了多个不同线程的解决方案 但到目前为止还没有解决方案 5 天前 当我使用 Eclipse 时 我没有任何问题 现在到今天我突然无法使用 ctrl space 自动完成 sysout 据我所知 Ec
  • 在 C 中将数组作为参数传递

    我 认为我 明白 如果数组是在编译时在堆栈上声明的 则只能检索数组的大小 使用 sizeof 例如 int my array 1 2 3 sizeof my array 3 一旦你开始使用指针 你就会失去这个长度信息 例如如果将 int 指
  • 如何在 Spring RestTemplate 中使用以 JSON 表示的查询参数?

    我需要使用 Spring RestTemplate 向具有表示为 JSON 的查询参数的 HTTP 端点发出请求 restTemplate getForObject apiRoot path object myObject Response
  • 当 DateTime 字段为 null 时,LINQ 中“指定的转换无效”

    我遇到问题了 我的代码使用 LINQ var resultCases from row2 in dtCases AsEnumerable where row2 Field
  • PHP 线程应该如何存储其数据?

    所以我一直在网上搜索和阅读有关 PHP pthreads3 以及它们应该如何存储数据的信息 或者更确切地说 他们不是 在我看来 线程正确存储其数据的唯一方法是创建一个新的 Threaded 对象并将其发送到线程 然后 线程可以使用此 Thr
  • UINavigationController 不弹出 UINavigationBar 项目

    我遇到一个问题 当 UINavigationController 弹出视图控制器时 我的 UINavigationBar 没有弹出它的项目 我查看了堆栈 观察到以下内容 分配的导航控制器的预期数量 在仪器中检查 堆栈上有正确数量的控制器 调
  • 如何在选中复选框的情况下克隆第一个框中的每个输入的输入?

    我想将每列的第一个输入的类型克隆 复制到同一类 id 的子框中 例如 有 5 列数据 每列都有自己的类和特定 ID 一旦我开始在每列的顶部输入上输入并选中复选框 该列的后续 子输入开始键入相同的笔划 JS var input1 docume
  • 由于twisted-iocpsupport,将 Django 应用程序部署到 Heroku 时出现问题

    我正在尝试将我制作的 Django 应用程序部署到 Heroku 上 最终弄清楚如何将其推送到 git 后 我 尝试这样做 git push heroku master 但随后它无法推送 因为它无法构建 twisted iocpsuppor
  • nginx 错误连接到 php5-fpm.sock 失败(13:权限被拒绝)

    我将 nginx 更新为1 4 7和 PHP 到5 5 12 之后我得到了502错误 在我更新之前一切正常 nginx 错误 log 2014 05 03 13 27 41 crit 4202 0 1 connect to unix var
  • Gprof:特定功能时间[重复]

    这个问题在这里已经有答案了 我想找出程序中特定函数所花费的时间 为此 我正在使用 gprof 我使用以下命令来获取特定函数的时间 但日志文件仍然显示程序中存在的所有函数的结果 请在这方面帮助我 gprof F FunctionName Ex
  • LoadLibrary:找不到指定的程序

    我需要在 Windows 2003 服务器中提取一些有关系统进程的信息 是的 在 2019 年 我用 python 编写了该代码 并使用auto py to exe 当我运行 exe文件在服务器上 我收到一条错误消息 LoadLibrary
  • 如何在 Eclipse 中使用 glassfish 适配器进行热部署

    有没有人获得 glassfish v3 适配器来与 Eclipse 一起使用 而无需每次代码更改时都重新启动 我尝试进行设置 但每次我更改任何文件时适配器都会 重新发布 这非常烦人 最多需要 3 分钟 并且会锁定我的机器一秒钟 我必须记住在
  • 批处理文件:在FOR循环中跳过以_开头的文件夹

    我想排除所有以 无需在排除文本文件中列出每个配置文件 是否有可能做到这一点 echo off set Target D backup for f tokens I in dir a d h b SystemDrive Users do if
  • 通过简单的适配器在imageview中显示位图图像

    我从网址获取图像 我在列表视图中使用图像视图 我想将位图图像列表添加到列表项的每一行中 我使用 SimpleAdapter 但图像视图显示空白 我的代码如下 ArrayList
  • 使用 c-driver 按索引更新 mongo 数组元素

    为了更新 mongo 数组的元素 我使用了如下语法 set a 0 1238 a 1 402 或者 更准确地说 我正在使用我认为与其等效的 C 驱动程序函数调用 这似乎工作正常 但是当我查看 MongoHub 中的对象时 我看到 a 0 1
  • Python - Pandas 用字符串删除行

    在我的数据集中 我有几行包含字符 我只需要包含所有整数的行 最好的方法是什么 以下数据集 例如 我想删除第 2 行和第 3 行 因为它们分别包含 051A 04A 和 08B 1 2017 0 321 3 20 42 18 2 051A 0
  • 如何编写 PostSharp Invoke 方面来简化跨线程控制更新

    当我想跨线程更新控件时 我通常会这样做 this Invoke MethodInvoker delegate SomeProcedure 建议的方法实际上是调用要更新的特定控件的调用程序 但 99 的情况下 表单 即我的示例中的 this