【问题标题】:WinForm MVP with Unsolicited Event Thread带有主动事件线程的 WinForm MVP
【发布时间】:2011-12-07 22:12:35
【问题描述】:

我继承了一个大型 WinForm 应用程序,该应用程序可能需要进行一些重写。我在 ASP.NET Web 窗体中的 MVP 架构上取得了成功,并认为它非常适合这个应用程序。

该应用程序主要监听来自 IVR 系统的非请求事件(电话响铃、呼叫挂断等),并允许用户向 IVR 发出请求事件(拨号、转接、保持等)。我已经很好地掌握了将 MVP 用于请求事件,但我在概念化如何处理非请求事件时遇到了障碍。

今天,应用程序启动一个线程,每 500 毫秒对 IVR 进行极点(现在我写这篇文章可能是主动请求而不是主动请求)。

这个线程会在哪里触发?它会在主窗体的演示者中吗?

编辑: 再想一想,我觉得把它放在 Main 窗体的 Presenter Init 方法中是有意义的。我这样想对吗?

【问题讨论】:

  • 您正在与之交互的可悲的未指定系统基本上是异步的。当我在做其他事情时,电话总是响起。因此,当事件在另一个线程上引发时,不要感到惊讶。需要 Control.BeginInvoke()。
  • 我不太确定你是在批评我的问题描述还是同情我的困境。
  • 这个问题有点含糊。我不确定您是否只是询问应该在哪里创建轮询线程(是的,系统初始化通常在主演示者 Initialize() 方法中进行),或者您是否需要更具体的帮助。

标签: winforms multithreading mvp


【解决方案1】:

我会将它放在引导程序中,因为这似乎是您的应用程序的基本组件(如果您有,如果不在启动主应用程序表单的同一位置)。

我认为你应该将这个轮询逻辑封装到某种单例中,当确定有值得通知的事情时会引发一个事件。

实现这一点的一种方法是使用 Timer 创建一个单例。 在 ontimer 事件中,您会去检查 IVR,看看是否有任何有趣的事情需要通知。

要知道你需要通知谁,你需要为那些有兴趣接收通知的人保留一个订阅者列表(如在观察者模式中),或者有一个 .net 事件来让你的演示者附加/分离,或者你也可以使用 Prism 框架提供的一些分离事件的实现。

【讨论】:

  • 您希望我关注什么?
  • 如何将轮询逻辑置于单例模式中,然后引发事件?
  • @Novus,查看最后两段以获取示例
猜你喜欢
  • 2018-12-29
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 2016-10-14
  • 2012-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多