CLR .NET 4.5 基类库中的新增功能.docVIP

  • 3
  • 0
  • 约1.19万字
  • 约 17页
  • 2016-02-24 发布于江苏
  • 举报
CLR .NET 4.5 基类库中的新增功能.doc

.NET 4.5 基类库中的新增功能 Immo Landwerth Microsoft .NET Framework 基类库 (BCL) 中包含的全都是基本类。 虽然有些基本结构很稳定而不会发生多大变化(如 System.Int32 和 System.String),但 Microsoft 还是在这方面投入了很多人力和物力。 本文介绍了 .NET Framework 4.5 中对 BCL 进行的重大改进(以及一些很小的改进)。 在阅读本文时,请记住本文以 .NET Framework 4.5 测试版为基础,而不是以最终产品和 API 为基础,因此,功能可能会有所变化。 如果您希望简要了解 .NET Framework 中的其他方面(如 Windows Communication Foundation (WCF) 或 Windows Presentation Foundation (WPF)),请参阅 MSDN 库页面“.NET Framework 4.5 测试版中的新增功能”(bit.ly/p6We9u)。 简化的异步编程 使用异步 I/O 有很多优点。 这有助于避免阻止 UI,并且可以减少操作系统需要使用的线程数。 然而,您很可能无法利用该功能,因为异步编程过去一直相当复杂。 最大的问题是,以前的异步编程模型 (APM) 是围绕 Begin/End 方法对设计的。 为了说明这种模式的工作原理,请考虑使用下面的简单同步方法来复制流: public void CopyTo(Stream source, Stream destination) { byte[] buffer = new byte[0x1000]; intnumRead; while((numRead = source.Read(buffer, 0, buffer.Length)) != 0) { destination.Write(buffer, 0, numRead); } } 要将这种方法变为使用较早 APM 的异步方法,您必须编写图 1 中所示的代码。 图 1 使用旧异步方法复制流 public void CopyToAsyncTheHardWay(Stream source, Stream destination) { byte[] buffer = new byte[0x1000]; ActionIAsyncResult readWriteLoop = null; readWriteLoop = iar = { for(bool isRead = (iar == null); ; isRead = !isRead) { switch(isRead) { casetrue: iar = source.BeginRead(buffer, 0, buffer.Length, readResult = { if(readResult.CompletedSynchronously) return; readWriteLoop(readResult); }, null); if(!iar.CompletedSynchronously) return; break; casefalse: intnumRead = source.EndRead(iar); if(numRead == 0) { return; } iar = destination.BeginWrite(buffer, 0, numRead, writeResult = { if(writeResult.CompletedSynchronously) return; destination.EndWrite(writeResult); readWriteLoop(null); }, null); if(!iar.CompletedSynchronously) return; destination.EndWrite(iar); break; } } }; readWriteLoop(null); } 显然,异步版本并不像同步方法那样易于理解。 人们很难从样板代码中了解编程意图;在涉及委托时,需要使用该代码以使基本编程语言结构(如循环)能够正常工作。 如果您没有被困难所吓倒,请尝试添加异常处理和取消。 所幸的是,此 BCL 版本提供了基于 Task 和 TaskT 的新异步编程模型。 通过添加 async 和 await 关键字,C# 和 Visual Basic 提供了极佳的语言支持(顺便说一下,F# 已通过异步工作流为其提供语言支持,事实上,此功能的灵感就来源于此)。 因此,编译器现在承担了样板代码的大多数工作(即便不是全部),而过去您必须得自己编写这些代码。 新的语言支持再加上 .NET Frame

文档评论(0)

1亿VIP精品文档

相关文档