通过 C# 简化 APM
(CLR) 的 APM,来执行与 SynchronousPattern 方法相同的操作。您会立即看到实现过程要复杂得多。请注意,ApmPatternWithMultipleMethods 方法会启动异步 I/O 操作,操作完成时会调用 ReadCompleted 方法。同时请注意,两个方法之间的数据传递是通过将共享数据封装到 ApmData 类的实例来完成的,为此我必须专门进行定义,以便启用这两个方法之间的数据传递。还应注意,不能使用 C# using 语句,因为 FileStream 是在一个方法中打开,然后在另一个方法中关闭的。为弥补这个问题,我编写了代码,用于在 ReadCompleted 方法返回之前显式调用 FileStream 的 Close 方法。
ApmPatternWithAnonymousMethod 方法展示了如何使用 C# 2.0 称为匿名方法的新功能重新编写此代码,通过此功能您可以将代码作为参数传递到方法。它能有效地让您将一个方法的代码嵌入到另一个方法的代码中。(我在所著书籍“CLR via C#”(CLR 编程之 C# 篇)(Microsoft Press, 2006) 中详细说明了匿名方法。)请注意,ApmPatternWithAnonymousMethod 方法要简短得多,也更易于理解 — 在习惯使用匿名方法后就可以体会到这一点。 首先,请注意该代码较简单,因为它完全包含在一个方法内。在此代码中,我将调用 BeginRead 方法启动异步 I/O 操作。所有 BeginXxx 方法会将其第二个至最后一个参数视为一个引用方法的委托,即 AsyncCallback,该方法在操作完成时由线程池线程进行调用。通常,使用 APM 时,您必须编写单独的方法,为该方法命名,并通过 BeginXxx 方法的最后一个参数将额外数据传递到该方法。但是,匿名方法功能允许只编写单独的内嵌方法,这样启动请求和处理结果的所有代码便会和环境协调。实际上,该代码看上去与 SynchronousPattern 方法有些类似。 其次,请注意 ApmData 类不再是必需的;您不需要定义该类、构造其实例以及使用它的任何字段!这是如何实现的?其实,匿名方法的作用不仅仅限于将一个方法的代码嵌入另一个方法的代码中。当 C# 编译器检测到外部方法中声明的任何参数或局部变量也用于内部方法时,该编译器实际上会自动定义一个类,并且两个方法之间共享的每个变量会成为此编译器定义的类中的字段。然后,在 ApmPatternWithAnonymousMethod 方法内,编译器会生成代码以构造此类的实例,且引用变量的任何代码都会编译成访问编译器所定义类的字段的代码。编译器还使得内部方法成为新类上的实例方法,允许其代码轻松地访问字段,现在两个方法 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |