在 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/