.net WinForms:让UI独立于BLL层运行的实现问题?

.net WinForms:让UI独立于BLL层运行的实现问题?,.net,multithreading,mvp,.net,Multithreading,Mvp,我正在尝试用MVP风格开发一个Windows窗体应用程序,但之前没有做过太多的线程工作,所以我感到很困惑 我的UI是一组非常简单的表单。每个表单都实现一个接口,并包含对位于业务逻辑层的中介类的引用,反之亦然。 因此,简化图如下所示: CheckInForm : ICheckIn <-------> CheckInMediator : ICheckInMediator --------------------------------------

我正在尝试用MVP风格开发一个Windows窗体应用程序,但之前没有做过太多的线程工作,所以我感到很困惑

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

CheckInForm : ICheckIn                      <-------> CheckInMediator : ICheckInMediator
----------------------------------------------------------------------------------------
CheckInForm.Show()                          <--------
                                            --------> AttemptCheckIn(CheckInInfo)
CheckInForm.DisplayCheckInInfo(DisplayInfo) <-------- 
                                            --------> CompleteCheckIn(AdditionalCheckInInfo)
  PleaseWaitDialog.Show()                   <--------
  PleaseWaitDialog.Close()                  <--------
CheckInForm.Close()                         <--------
checkinfo:ICheckIn CheckInMediator:ICheckInMediator
----------------------------------------------------------------------------------------
checkinfo.Show()尝试签入(CheckInInfo)
CheckInfo.DisplayCheckInInfo(DisplayInfo)CompleteCheckIn(AdditionalCheckInInfo)

请查看ItDialog.Show()您查看过这个类吗?它非常适合在后台类型的过程中进行大量简化处理,并提供可以列出的事件,以便GUI显示进度。

您可以从另一个线程操作WinForms控件,但您需要使用
Control.Invoke()
,由于上下文切换和相关的幕后CLR巫毒,您将为每个跨线程调用支付相当大的性能损失

如果您想在多线程应用程序中将GUI与业务逻辑和基础结构代码分离,我建议切换到使用线程安全队列的消息传递模型。每当底层需要告诉GUI做一些事情时,他们就会将一个消息对象放入队列中,GUI元素通过
Forms.Timer
定期轮询该队列。这对于大型处理器密集型应用程序尤其有效,因为您可以通过调整更新计时器频率在一定程度上限制GUI更新的处理需求


对于以另一种方式返回的调用(GUI->lower layers),您可以从GUI代码中调用中介方法,只要这些调用返回得相当快——您需要非常小心延迟GUI线程,因为整个应用程序的响应性都会受到影响。如果您有一些呼叫很难快速返回,您可以添加另一个队列以另一种方式返回。

我已经看过了,但一定不能完全理解它在这种情况下的工作原理。您可以进一步解释吗?在上面的示例中,您可以使用BackgroundWorker选项让DisplayCheckinInfo方法触发CompleteCheckIn方法。这样,完整的检查过程可以在一个单独的线程中启动,然后你可以跟踪它的进度,并相应地更新对话框。你知道有什么文章或源代码可以这样做,以便我可以看到一些实际的例子吗?老实说,这是一个相当简单的应用程序,所以性能不是一个大问题。