每周源代码56- Visual Studio 2010和.NET Framework 4 教材- 代码协定, 并行计算框架 和COM 互操作


[原文发表地址] The Weekly Source Code 56 - Visual Studio 2010 and .NET Framework 4 Training Kit - Code Contracts, Parallel Framework and COM Interop

[原文发表时间] 2010-08-12 02:07

 你喜欢一大堆的源代码吗?Visual Studio 2010 和 .NET Framework 4教材中就有许多现成源代码。它实际上是一个178兆的下载文件,这真是太疯狂了。如果你现在开始下载,等你早上起床的时候,下载就已经完成了。把这些资源整合在一起真的是太好了,我真的非常感谢提供这些资源的朋友们。他们都比我优秀很多。

我喜欢一个人看电视的时候浏览这些代码,今晚我就一直在看。亲爱的读者,我看了下我的博客,发现很早以前就应该跟大家一起分享的。但是那时却没能及时分享。是我的错,但是确实是因为这篇博客很有技术含量。自然是关于C# 和VB。

这是里面的大纲。我听说有些人建立了午餐时间学习小组,并打算学习以下每个部分。

C# 4

Visual Basic 10 

F#

Parallel Extensions

Windows Communication Foundation

Windows Workflow

Windows Presentation Foundation

ASP.NET 4

Windows 7

Entity Framework

ADO.NET Data Services (OData)

Managed Extensibility Framework

Visual Studio Team System

RIA Services

Office Development

 

我在我的演讲中相当喜欢用这个资源包中的例子。在关于.NET 4的演讲中(Lap Around .NET 4 talk.)也用的比较多。

这些例子、演示和链接都有相关的在线视频,  它会一步步地引导你完成这些例子。这也是你体验.NET 4新的内容的一个良好的开端。

以下是我喜欢的部分,这些可不是废话。

代码协定

记住一句谚语:“对你的期望值设置断言?” 有时候Debug.Assert用起来不是不恰当,就是显得有点繁琐。其实你真正需要的是方法协定方法包括方法名和参数,这些就是协定现在他们可以设定类似于这样的条件:“你不要访问这个方法除非用户名大于或等于0,并且确保结果不是Null。

代码协定在不断地被修订,上个月还发布了2008和2010的新版本。你需要的核心类型包含在.NET 4.0的 mscorlib中。但是你必须先下载工具,才能在Visual Studio里面看到。如果是VS Pro,就需要进行运行库检查,如果是Vs Ultimate,则需要运行库检查和静态检查。如果我进行了静态检查而且也下载了工具,那就能在项目属性中看到新的标签。

1

下面可以看到,如果违反了协定的话,就会出现蓝色的标记。

2

很巧的是,你可以去这个网站免费下载这篇文章 Jon Skeet的 C# 深入研究中的第十五章 ,它刚好介绍了代码协定。

下面介绍它基本概念。如果你经过静态分析,就会看到那些没有遵守协定的那几行都被标出来了。否则,你会得到一个运行时异常ContractException。当和测试驱动开发结合使用时代码协定是一个非常棒的工具。

3

.在NET 4 中COM 互操作变简单了

过去我对COM Interop进行过大量的研究,但是结果总是不尽人意。当退出托管代码,来使用COM. 时,心里真不是滋味。你不得不使用主互操作程序集(Primary Interop Assemblies),这确实是一个眼中钉。去年我在Beta1里提起过几点。但它在.NET 4版本中变得更简单了。

下面是我从资源包中用到的示例。它会获取你系统上的进程。然后,用LINQ列出一些大的进程。然后再Exel里制作一个图表,再把图表粘贴到Word里面。

如果你以前在托管代码中使用过Office自动化的话,请注意,现在你可以用输入Range[],而不是get_range()。你可以用命名实参来调用COM方法ChartWizard而不需要再写15个Type.Missing。另外,请注意方法上的默认参数值。

4

你也可以把你的PIAs(主互操作程序集)嵌入到程序集,而不要过于分散。

在运行时会通过Type Equivalence来测出你的嵌入类型是否与它需要的相吻合就行了。这样就减轻了部署工作量。

并行扩展库

,首先,依我个人浅见NET4是个并行组件。我并不是以微软技术人士的身份来说这句话的,而只是站在一个拥有6核(12个超线程)处理器的人的角度上来说的。教材中的程序我最喜欢的是ContosoAutomotive。这是一个小的WPF程序,能加载成百上千辆小车到网格中。 这个程序中有一个接口IcarQuery,它有一大串插件实现并且这个程序遍历了CarQueries

这个代码段用了一个新的System.Threading.Task 任务 ,并且把它作为一个后台任务。这一行全都在这里,从StartNew()一直到最后。它的意思是把这些信息块都放到后台来处理。这是一个自然,顺畅的接口。它使你的UI线程一直处于填充状态,这样你的程序就不会被卡住,让大家看起来它没有任何反应而一直停留在那。

5

StartNew()也有一个取消口令以便我们审核,以防有人中途点击了“取消按钮”。最后还有一个ContinueWith 方法 ,可以使你重新启用或禁用搜索按钮。

下面是我的系统信息当运行这些查询方法。这些都在内存里面,生成和查询随机的车。

6

程序上显示它花了2.3秒钟。如果用这所有的处理器来做并行计算的话又会怎样呢?

7

下面是修改过的代码。我们用Parallel.ForEach代替。大体上是一样的。

8

这个代码是:“用后台线程来处理,当已经进入到后台线程了,那么并行处理这个查询”这是一个巨大的循环,内存中可以容纳200万辆车。毫无疑问,它不会轻易被损害,反而运气的速度更快了。

虽然运行速度很快,但任务管理器的更新速度却不能显示任务。任务其实很简单。你可以看到,它占用了很大的CPU,从10到12的负载量有一个激增的过程。但是任务却不足以稳住处理器。

9

这是一个飞跃吧?似乎快了5倍,从2.389秒到0.4699秒。这是一个尴尬的并行。组员喜欢把他叫做“快乐的并行”,我倒宁愿称其为:“你这个在并行中不干活的傻瓜”。但是被拒绝了。

10

我们再尝试一些更有难度的吧。对婴儿的名字进行研究吧。或者可以从500兆的数据库里研究40年来华盛顿州生产的机器人数量吗?

下面是正常情况下的任务管理器中的单线程遍历版本。

11

下面是CPU占有率为96%的情况下的并行版本。

12

下面是它的计时。前一个是20秒,后一个接近4秒。

13

你自己可以尝试一下。注意底部的Processor的滑动条。

14

这个事例用"Parallel LINQ",这是两个查询条件。注意这个方法"WithDegreeofParallelism."

15

.NET 4教材有可扩展性演示,Office演示,Sharepoint演示和Data Access演示等等。它真的太棒了,就像是万能箱。我建议你进到这个网站去下载它。在公司或学校可以把它当作教学工具。你可以自己学习它,小组讨论它,演讲中使用它(有很多PPT),试验中分析它等等。

希望大家喜欢!


Comments (0)

Skip to main content