我是否使用正确的方法来监视创建句柄时要执行的任务?

2023-11-25

是否有普遍接受的最佳实践来创建自行取消订阅的事件处理程序?

例如,我想到的第一件事是:

// Foo.cs

// ...
Bar bar = new Bar(/* add'l req'd state */);
EventHandler handler = new EventHandler(bar.HandlerMethod);

bar.HandlerToUnsubscribe = handler;

eventSource.EventName += handler;
// ...

// Bar.cs

class Bar
{
    /* add'l req'd state */

    // .ctor

    public EventHandler HandlerToUnsubscribe { get; set; }

    public void HandlerMethod(object sender, EventArgs args)
    {
        // Do what must be done w/ add'l req'd state
        ((EventSourceType)sender).EventName -= this.HandlerToUnsubscribe;
    }
}

说这感觉很糟糕/很糟糕是轻描淡写的。它与时间依赖性紧密耦合(HandlerToUnsubscribe必须在正确的时间分配准确的值)。我觉得在这种情况下我一定扮演了一个复杂化者的角色——我是否遗漏了一些愚蠢或简单的东西?

Context:

我正在 Winforms 中创建 UI 和专有命令基础结构之间的绑定(使用有用的ICommand在系统.Windows.输入中)。绑定基础设施的一个方面是,在 UI 命令组件(如工具栏按钮或菜单项)之间创建绑定的用户可以选择监听命令的CanExecuteChanged事件,然后根据该事件更新 UI 的状态 - 通常将 Enabled 属性设置为true or false.

该技术通常工作得很好,但有一些方法可以在创建 ui 组件的句柄之前触发事件。我试图保证提供的处理程序不会运行,除非已创建句柄。因此,我正在考虑提供一个通用的帮助类(“Bar“)这将有助于实施。目标Bar是检查是否存在适当的句柄。如果是这样,那就太好了!如果没有,它将订阅适当的IsHandleCreated事件,以便在最终创建句柄时运行提供的处理程序。 (这很重要,因为客户端可以在句柄存在之前在 UI 的 .ctor 中设置其绑定。)但是,我希望此订阅完全透明,因此我也希望每个事件处理程序自动取消订阅IsHandleCreated一旦运行完成。

我仍然在试图弄清楚这是否是一个好主意,所以我还没有概括这个概念 - 在这种情况下我只是直接针对 ToolStripItems 实现它来验证这个想法是健全的。不过,我还没有相信它。

据我了解,我还可以选择简单地强制只能在创建 UI 句柄后(在表单的 OnLoad 事件中)创建绑定(例如)。我知道这可行,我过去就这么做过。我想看看在这种情况下我是否可以放松这一特定要求。如果还实用的话。


Greg,

你有什么is not观察者模式,而是消息队列。所以你只是对你想要解决的问题使用了错误的设计模式。

使用以下方法从头开始实现您自己的消息队列非常容易Queue{Action{object}},其中对象自行排队,您只需在调用它们时将项目出队即可。

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

我是否使用正确的方法来监视创建句柄时要执行的任务? 的相关文章

随机推荐

  • 在 AngularJS 中,我可以在 ngView 之外的 ngSwitch 中使用当前路由吗

    我正在尝试根据当前视图更改页眉 标头位于 ngView 之外 这是可能的还是我需要将标题放在视图中 我的代码看起来与此类似 div div div Welcome div div Our products div div Contact u
  • 用逗号分割字符串列表

    我想转换 60 78 70 77 80 74 90 75 100 74 110 75 in to 60 78 70 77 etc 我以为我可以用 for word in lines word word split newlist appen
  • Yahoo 和 MS 支持 Oauth 2.0 吗?以及有关 oAuth 2.0 的几个问题

    我有几个问题 yahoo 和 microsoft api 支持吗 oAuth 2 0 如果是的话主要是什么 应采取的安全措施 转移时得到照顾 oAuth 1 0 到 oAuth 2 0 Google API 支持 oAuth 2 0 但 他
  • 从文本文件中解析数据

    我有一个文本文件 其内容如下 ENTRY 01 ID 01 Data1 0 1834869385E 002 Data2 10 9598489301 Data3 0 1091356549E 001 Data4 715 然后是一个空行 并重复更
  • 使用折叠表达式打印所有带有换行符的可变参数

    C 17 折叠表达式的经典示例是打印所有参数 template
  • 确定Java平台的默认字符集

    我正在用 Java 编程 我的代码如下 byte b test getBytes 在 api 中指定 如果我们不指定字符编码 则采用默认的平台字符编码 默认平台字符编码 是什么意思 它是指 Java 编码还是操作系统编码 如果这意味着操作系
  • wxpython 3.0 破坏了旧应用程序? (区域设置错误)

    我有一个可以与旧版本的 wxpython 正常运行的应用程序 现在使用 wxpython 3 0 当尝试运行该应用程序时 出现以下错误 File C Python27 lib site packages wx 3 0 msw wx cont
  • 将背景图像设置为动态 svg 数据?

    最初我有一些内联 svg 它可以按我想要的方式工作
  • PHP SOAP 过程“functionName”不存在

    我正在 Symfony 中编写 SOAP 应用程序 对于我的所有请求 我收到错误Procedure getClusterName not present 奇怪的是 当我用纯 PHP 创建测试 SOAP 应用程序时 它工作正常 但 Symfo
  • 测试 APK 扩展库时出现问题

    我已经将来自 Google 的 APK 扩展文件下载库集成到我的项目中 它的工作或多或少都正常 除了一些小问题 其他人已经在 SO 上报告过这些问题 然而 我很难测试它 当我第一次测试它时 我将签名的 APK 主扩展文件版本 1 上传到 G
  • 如何通过 app.config 变量覆盖 settings.settings 变量

    如何通过在生产时将变量添加到 app config 来更改 或覆盖 settings settings 变量 无论如何 这可能吗 您必须直接引用您尝试覆盖的 applicationSettings 并显式指定具有替换值的属性
  • 如何修复架构 x86_64 的 g++ 未定义符号错误?

    首先 我已经阅读了Stackoverflow上关于这个问题的相关内容 但仍然无法解决 我已经尽可能地简化了我的代码 我只有一个带有 h 和 cpp 文件的自定义类 但在尝试从 main cpp 创建此类的实例时出现错误 main cpp i
  • .NET 内核之间线程的移动

    跟进问题来自多核使用 线程 线程池 线程在其生命周期内是否从一个核心移至另一个核心 当然 想象一下你有三个 在双核系统上运行的线程 给我一个公平的时间表 但不 涉及定期移动线程 核心之间 这是我第一次访问这个网站 所以我想我没有足够的代表来
  • MongoDB c# 驱动程序 - 名为 Id 的字段可以不是 Id 吗?

    更具体地说 有一个类 class X string Id get set class Y X ObjectId MyId get set 我希望 MyId 成为 Y 的 id 即映射到 id 是否可以 在这段代码之后我得到一个异常 var
  • SQLAlchemy - 如何映射只读(或计算)属性

    我试图弄清楚如何映射一个简单的只读属性 并在保存到数据库时触发该属性 一个人为的例子应该可以让这一点更加清楚 首先 一个简单的表格 meta MetaData foo table Table foo meta Column id Strin
  • 用因子替换一定范围内的数字[重复]

    这个问题在这里已经有答案了 给定一个由一系列整数 年龄 组成的数据帧列 我想将整数范围转换为序数变量 我当前的代码不起作用 我该怎么做 df lt read table http dl dropbox com u 822467 df csv
  • unity Shader 使用 Shader.Find 时返回 NULL

    就像声明的那样here我不是唯一发现以下问题的人 Shader Find 返回 Null 在上面的链接中 他们通过在资源文件夹中创建某些内容 给出了解决方案 但我不确定我是否理解 首先 这对于所有情况都是必要的吗 意味着 Shader Fi
  • 更改 Windows 窗体中的内容

    我正在使用 Windows 窗体在 C 中制作一个应用程序 我想完全交换 Windows 窗体中的所有内容并将其替换为其他内容 有什么方便的方法可以做到这一点吗 示例 我有一个菜单 当我单击 开始 时 我希望菜单消失并开始游戏 我没有使用
  • Windows Phone 7.1 和 Windows Phone 8 上的 Sqlite

    我正在开发一个适用于 Windows Phone 7 1 7 5 8 必须适用于两者 的应用程序 其中需要数据库连接 该应用程序已经针对 Iphone 和 Android 实现 因此我必须使用那里的数据库文件 以使所有应用程序的数据库结构都
  • 我是否使用正确的方法来监视创建句柄时要执行的任务?

    是否有普遍接受的最佳实践来创建自行取消订阅的事件处理程序 例如 我想到的第一件事是 Foo cs Bar bar new Bar add l req d state EventHandler handler new EventHandler