技术开发 频道

初探.NET4和VS 2010中的多核利用

  出错时如何处理

  在多个处理器上同时执行多个线程也会造成异常出现得更频繁,任何线程上一旦发生异常,整个应用程序都将挂起,给AggregateException对象添加的错误处理也会增加,通过这个对象的InnerExceptions属性允许你查看每个线程的异常。

Dim Messages As New System.Text.StringBuilder  Try        
'PLINQ or TPL processing  Catch aex As AggregateException  
For Each ex As Exception In aex.InnerExceptions      
Messages.Append(ex.Message
& "; ")    
Next  
End Try

 

  注意这里没有使用Catch语句,你需要检查InnerExceptions的类型,确定每个线程究竟抛出的是什么异常。

  调试并发线程变得更加有趣,因为异常可能随一个PLINQ查询中的循环出现,解决这个问题可能需要重构PLINQ查询,幸运的是,Visual Studio 2010包括了额外的工具调式并行错误。

  并行堆栈窗口(Parallel Stacks)超越了旧的线程窗口,线程窗口只能提供一个视图,而并行堆栈窗口可以显示所有正在执行的线程,例如,它默认允许你同时查看多个线程的调用堆栈,你可以放大显示内容,也可以过滤只显示指定的线程,更重要的是,如果你使用TPL,你可以切换到基于任务的视图(对应于你代码中的Task对象),或方法视图(显示调用方法的任务),但使用并行任务窗口(Parallel Tasks)可能更有用,因为它围绕Task组织任务,这个窗口不仅显示当前运行的任务,已调度和等待运行的任务也会显示(显示在状态[Status]列),你可以通过检查当前运行的Task是否在等待其它任务,从而确定Task之间的依赖关系。

  在早期的Visual Studio版本中,要一步一步调式多线程程序是一场噩梦,因为调试器要从一个线程中的当前语句跳转到另一个线程的当前语句,并行任务(Parallel Task)允许你冻结或解冻与Task相关的线程,在调试时控制哪一个线程先运行。

  一起使用这两个窗口可以简化并行处理问题的诊断,例如,Visual Studio现在检测到一个死锁时,它会自动打破死锁,当调式器检测到两个或多个Task不能处理时(因为相互都在等待对方释放锁定的对象),Visual Studio将实施冻结处理,就好像你遇到一个断点似的,并行任务窗口将显示每个Task在等待的对象,以及它占有的线程,并行堆栈窗口的方法视图可视化显示了发生死锁时哪个Task调用了哪个方法。

  其它调试功能

  除了这些工具外,Visual Studio还包含了其它几个用于调式并行处理的功能,在遍历你的代码时,当你的鼠标移到一个Task对象上时,弹出一个提示窗口,显示该任务的Id,关联的方法和它当前的状态(如,等待执行)等详细信息,进一步展开该提示,可以看到该Task的属性值,包括它的结果。在观察窗口(Watch)中检查Task的InternalCurrent属性,可以得到当前正在执行的Task的信息,任务调度器(TaskScheduler)的提示展开后可以看到它管理的所有Task。

  合理使用PLINQ,TPL和Visual Studio提供的功能,无论你的应用程序运行在什么计算机上,你都可以利用所有处理器的计算能力。

0
相关文章