通过 C# 简化 APM
曾一直赞扬异步编程模型 (APM) 的优点,强调异步执行 I/O 密集型操作是生产高响应和可伸缩应用程序及组件的关键。这些目标是可以达成的,因为 APM 可让您使用极少量的线程来执行大量的工作,而无需阻止任何线程。遗憾的是,使用 APM 构建典型的应用程序或组件有些难度,因此许多程序员不愿意去做。 有几个因素使得 APM 难以实现。首先,您需要避免状态数据驻留于线程的堆栈上,因为线程堆栈上的数据不能迁移到其他线程。避免基于堆栈的数据意味着必须避免方法参数和局部变量。多年以来,开发人员已喜欢上参数和局部变量,因为它们使编程变得简单多了。 其次,您需要将代码拆分为几个回调方法,有时称为“续”。例如,如果在一个方法中开始异步读取或写入操作,之后必须实现要调用的另一个方法(可能通过不同的线程),以处理 I/O 操作的结果。但程序员就是不习惯考虑以这种方法进行数据处理。在方法和线程之间迁移状态意味着状态必须进行打包,导致实现过程复杂化。 再次,众多有用的编程构造 — 如 try/catch/finally 语句、lock 语句、using 语句,甚至是循环(for、while 和 foreach 语句)— 不能在多个方法之间进行拆分。避免这些构造也增加了实现过程的复杂性。 最后,尝试提供多种功能,如协调多个重叠操作的结果、取消、超时,以及将 UI 控件修改封送到 Windows® 窗体或 Windows Presentation Foundation (WPF) 应用程序中的 GUI 线程,这都为使用 APM 增加了更多的复杂性。 在本期的专栏中,我将演示 C# 编程语言的一些最新添加内容,它们大大简化了异步编程模型的使用。之后我会介绍我自己的一个类,称为 AsyncEnumerator,它建立在这些 C# 语言功能的基础上,用来解决我刚提到的问题。我的 AsyncEnumerator 类能够让您在代码中使用 APM 变得简单而有趣。通过此类,您的代码会变得可伸缩且高响应,因此没有理由不使用异步编程。请注意,AsyncEnumerator 类是 Power Threading 库的一部分,并且依赖于同样是此库一部分的其他代码;读者可从 Wintellect.com 下载该库。 匿名方法和 lambda 表达式 SynchronousPattern 方法显示了如何同步打开并读取文件。该方法简单明了;它会构造一个 FileStream 对象,分配 Byte[],调用 Read,然后处理返回的数据。C# using 语句可确保完成数据处理后会关闭该 FileStream 对象。 ApmPatternWithMultipleMethods 方法显示了如何使用公共语言运行时 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |