c# - Windows 窗体应用程序中不同线程中的 GUI 和逻辑分离

标签 c# .net winforms multithreading user-interface

在 Windows 窗体应用程序中,我想将 GUI 与逻辑分开。用户请求很复杂并且涉及通信,所以我不希望它依赖于 GUI 线程。结构应该是这样的:

        GUI -----> splash screen ---------> User Form --------------> ...
              |                        #
              | create Manager thread  | Show this Form
              #                        |
    Manager -----> Check user type -------> Wait for user command --> ...

对于这样的设计,您有哪些建议、指南或模式?这是正确的选择吗?谢谢!

编辑 管理器线程应该控制 GUI 而不是相反。此外,Manager 线程应该在所有应用程序时间内都处于事件状态。

最佳答案

传统上这样的工作是使用 BackgroundWorker 完成的

基本上,它是一个简单的类,使您能够在工作线程上执行功能,然后在该功能完成后自动调用回 UI 线程。在函数运行期间,UI 被解锁并可以显示进度消息,或处理其他用户输入(例如取消)。

结果与您的模式类似,但会为每个任务创建和销毁一个单独的线程(好吧,确实存在池...)。

UI thread ---> Show splashscreen------------------->Show window-------
                      |                           |return to UI      |
                      | create background worker  |                  |
                      -> Process user ------------                   ->Perform query etc.

好的,根据您的评论:

您可以使用这样的模式,这是一个简单的事件处理案例。授予管理器 UI 访问权限,以便它可以对其执行方法调用并在任务完成时注册事件(this link 显示了 .NET 中异步操作的两种主要模式)。在管理器内部,您需要维护一个任务列表,这些任务可以在单线程上按顺序执行,并确保调用以将结果返回到 UI 的事件被正确调用,以便在主 UI 线程上运行(基本上重新创建后台 worker 模式)。

我不确定您希望通过这样做获得什么,是否有理由将应用程序限制为两个线程?您是否担心创建后台 worker 的成本?您需要某种查询队列系统吗?您问题中图表中的示例似乎不需要这种模式的复杂性。

关于c# - Windows 窗体应用程序中不同线程中的 GUI 和逻辑分离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1333566/

相关文章:

c# - 如何将字符串传递给 UWP 应用程序并从 Windows 窗体应用程序启动它

c# - 使用批处理文件或 .NET 代码更改 Web.config 中的值

.net - 获得整数的二进制表示的最简单方法是什么?

c# - 在 Windows 窗体上拖动时调整矩形大小

c# - 表格中的圆角边缘

c# - 使用 Entity Framework 中的属性映射多对多关系

c# - 这种聚合设计模式有名称吗?

c# - 如何为 DataGridView 设置标题

c# - 为什么绑定(bind)数据上下文设置为控件的数据上下文?

.net - F# 中 CLI 事件的 C# 样式事件访问器