.net - WinForms : Implementation question for having my UI run independently of my BLL layer?

标签 .net multithreading mvp

我正在尝试以 MVP 风格做一个 Windows 窗体应用程序 - 之前没有对线程做太多工作 - 我感到很困惑。

我的 UI 是一组非常简单的表单。每个表单都实现了一个接口(interface)并包含对位于业务逻辑层中的中介类的引用,反之亦然。
所以简化图如下所示:

CheckInForm : ICheckIn                      <-------> CheckInMediator : ICheckInMediator
----------------------------------------------------------------------------------------
CheckInForm.Show()                          <--------
                                            --------> AttemptCheckIn(CheckInInfo)
CheckInForm.DisplayCheckInInfo(DisplayInfo) <-------- 
                                            --------> CompleteCheckIn(AdditionalCheckInInfo)
  PleaseWaitDialog.Show()                   <--------
  PleaseWaitDialog.Close()                  <--------
CheckInForm.Close()                         <--------

如您所见,中介类控制 UI,告诉它何时显示数据、启动、关闭等。它们甚至表示模式对话框何时出现以及何时关闭(即上面的 PleaseWaitDialog)。 UI 所做的是在屏幕上显示数据并将输入中继回中介。

这种架构很好且解耦,并且非常容易测试和原型(prototype)化。现在我将它们放在一起,但是我开始遇到线程问题。例如,如果我希望我的 PleaseWaitDialog 在 CheckInForm 上显示为模式表单(使用 ShowDialog()),直到由中介控制的计时器计数 5 秒(请记住,这是一个简化),我将收到一个跨线程错误如果我从计时器的回调中调用 PleaseWaitDialog.Close() 。同样,如果我有一个模式对话框阻止用户与 UI 交互,我不希望它阻止业务层中的事件,除非我另有说明(例如使用确认对话框)。

我想我想做的是在主线程上运行中介和业务逻辑,在一个完全独立的线程上运行 UI,我的第一个问题是这样做有意义吗?

我的第二个问题是,我该如何做一些事情,比如让一个类在一个单独的线程中运行?我如何让两者沟通?我正在阅读 .NET 线程,但我有一个截止日期和一些示例,说明如何在主线程上生成一个包含 UI 的线程并让它们的对象相互交谈真的很有帮助。

最佳答案

你看过BackgroundWorker类(class)?它非常适合在后台类型程序中进行大量简化处理,并提供可以列出的事件以使您的 GUI 显示进度。

关于.net - WinForms : Implementation question for having my UI run independently of my BLL layer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/164789/

相关文章:

c# - 使用 Mono P/Invoke : Why? 的 DllNotFoundException

c# - 为什么接口(interface)不是 [Serializable]?

c# - 等待第三方应用程序窗口加载

Java MVP - 不持有 Presenter 对象的引用?

.net - 如何按指定顺序将数千个 PDF 文件转换为单个 Postscript 文件

.net - Rhino 模拟 : How to mock ADO. NET 的 DataRow?

java - 带 Netty 的多线程 UDP 服务器

java - N+1 HTTP 调用通过同时队列进行批处理

cocoa - Cocoa MVC 真的不是 MVP 吗?

c# - 使用单例设计模式时,首选哪种结构,为什么?