gpt4 book ai didi

c# - C#中异步调用的设计模式

转载 作者:太空狗 更新时间:2023-10-29 22:55:19 25 4
gpt4 key购买 nike

我正在设计一个具有多层的桌面应用程序:GUI 层 (WinForms MVP) 保存对适配器类接口(interface)的引用,这些适配器调用执行实际工作的 BL 类。

除了执行来自 GUI 的请求外,BL 还会触发一些 GUI 可以通过接口(interface)订阅的事件。例如,BL 中有一个 CurrentTime 对象会定期更改,GUI 应该反射(reflect)更改。

有两个问题涉及到多线程:

  1. 我需要做一些逻辑异步调用,这样它们就不会阻塞 GUI。
  2. GUI 接收到的一些事件是从非 GUI 线程触发的。

最好在什么级别处理多线程?我的直觉告诉 Presenter 最适合,对吗?你能给我一些满足我需要的示例应用程序吗?对于演示者来说,保留对表单的引用以便它可以在其上调用委托(delegate)是否有意义?

编辑:除非有人给出更好的答案,否则赏金可能会交给 Henrik。

最佳答案

我会考虑使用 Task -based BLL 用于那些可以描述为“后台操作”的部分(也就是说,它们由 UI 启动并具有明确的完成点)。 Visual Studio Async CTP包括描述基于任务的异步模式(TAP)的文档;我建议以这种方式设计您的 BLL API(即使 async/await 语言扩展尚未发布)。

对于 BLL 中属于“订阅”的部分(也就是说,它们由 UI 启动并无限期地继续),有几个选项(按我个人喜好的顺序):

  1. 使用 Task基于的 API,但带有 TaskCompletionSource永远不会完成(或仅通过作为应用程序关闭的一部分被取消来完成)。在这种情况下,我建议您自己编写 IProgress<T>EventProgress<T> (在异步 CTP 中):IProgress<T>为您的 BLL 提供一个用于报告进度(替换进度事件)和 EventProgress<T> 的界面处理捕获 SynchronizationContext用于将“报告进度”委托(delegate)编码到 UI 线程。
  2. 使用 Rx 的 IObservable框架;这在设计方面是一个很好的匹配,但学习曲线相当陡峭,并且不如我个人喜欢的那样稳定(它是一个预发布库)。
  3. 使用老式的基于事件的异步模式 (EAP),您可以在其中捕获 SynchronizationContext在您的 BLL 中并通过将事件排队到该上下文来引发事件。

EDIT 2011-05-17:自从编写上述内容以来,Async CTP 团队已声明不推荐方法 (1)(因为它有点滥用“进度报告”系统),并且Rx 团队发布了阐明其语义的文档。我现在推荐订阅 Rx。

关于c# - C#中异步调用的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4584869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com