北京哪个医院治疗白癜风手术好 https://jbk.39.net/yiyuanzaixian/bjzkbdfyy/mbbdf_zx/emwsafw/编写并行算法与编写异步算法不是同一回事。在处理运算密集型的并行代码时,所遇到的困难与编写异步算法时不同,所要使用的工具或许也不一样。尽管依然可以在并行算法中使用基于Task的异步编程模型,但通常还会有更好的方案。本文介绍下以多种方式来使用多个程序库及工具,以演示如何才能较为顺畅地写出并行算法。1、了解PLINQ是怎样实现并行算法的如果想要并行的执行某条查询表达式,那么应该先在数据源上使用ASParallel()方法。执行了这个方法之后,系统就可以把接下来的操作放在多条线程中,并分配任务给多个核心区运行。AsParallel()方法的返回值类型不是普通的IEnumerableT,而是ParallelQueryT。PLINQ机制通过类中的一组扩展方法来实现。所不同的地方仅仅在于,PLINQ方法的参数的返回值类型和LINQ的返回值不同。因此,一般只要你掌握了LINQ,就基本上会使用PLINQ了。2、编写并行算法时要考虑异常情况如果你编写的并行算法必须要能够在发生问题的情况下进行回滚,那么需要了解出错的线程可能出现哪些附加效果,以便于拟定自己所能采取的恢复措施。并行算法中的异常,无论异常出现的位置有多深,并行库都会将它存放在AggregateException中的某个层次上。只要有一个后台线程抛出异常,就会导致执行同一批操作的其他线程也停止运行。你所能做的就是:如果这个异常能够得到处理,那就确保它不会离开运行算法逻辑的并行任务。反之,若是不能处理,则将要其抛出到合适的地方。为此,必须学会在发起后台的任务的主控线程中正确的处理AggregateException类型的异常。3、优先使用线程池而不是新的线程.NET线程池完全知道怎样在目标系统中确定最佳的活跃线程数量。此外,如果你想在某台计算机上创建数量极多的任务或者线程,那么线程池将会把这些请求排入队列。等到有某个后台线程可供利用的时候,在依次加以处理。更好的地方在于,如果你是通过Task.Run方法来启动任务的,那么基于Task的任务库能够利用线程池来运行这项任务,从而发挥它的优势。因此,编写应用程序代码时,不应该自己手动创建线程,而是应该调用并行任务库等程序库,并让那些程序库帮你管理线程及线程池。4、考虑使用BackGroundWorker在线程之间进行通信上BackgroundWorker类可以汇报多种情况,例如前台线程请求后台取消当前任务、后台向前台汇报任务执行进度、后台将任务顺利执行完毕或是在执行过程中发生错误等。该类定义了相关的协议事件,用以实现这套通信机制。如果要汇报进度,那么后台线程应该通过该类所定义的ReportProgress方法来触发ProcessChanged事件,而前台线程也必须通过该类的WorkreportsProgress属性指明这个BackGroundWOrker能够触发此种事件,并注册相应的处理程序来应对该事件。5、学会在XAML环境下执行跨线程调用DispatcherObject类是许多WPF控件的基类通过该基类的DisPatcher属性所表示的对象。,我们可以把与WPF控件有关的操作派发到合适的线程上。另外要注意,WPF允许开发者为事件处理程序所要执行的操作指定优先级。WPF应用程序使用两条UI线程,其中一条负责UI渲染管道,使得UI能够及时的绘制动画效果或者完成各项工作。开发者可以通过优先级参数告诉系统应该是优先渲染界面,还是应该优先处理事件程序。6、首先考虑用Lock()实现同步在.NET的基础类库中,有很多同步原语,可以确保资源在为多线程共用时能正确地得到同步。然而C#语言中有一种操作有着特殊地位。这就是Monitor.Enter()及Monitor.Exit()方法。因为他们能够实现临界区。由于这是一种常见的同步技巧,因此,C#语言的设计者直接提供了与之相应的Lock关键字。我们在编写线程同步相关代码时,也应该像这样通过Lock语句来实现。因为这样相当于让编译器替你去生成相关的代码,而编译器在执行这种操作时,不会像人那样犯错。7、尽量缩减使用范围在编写并发程序时,应该把同步原语尽量局限在你所能控制的范围内。这些原语出现得越多,就越有可能导致死锁、忘记加锁或者其他一些与并发有关的问题。也就是说,开发程序的调试难度与同步原语的数量是相关的:同步原语出现的地方越多,并发程序中的Bug就越难排查。8.不要再加了锁的区域内调用未知的方法某个线程在执行当前这个类中的某个方法的时候对资源加了锁,然后,它在没有解锁的前提下调用了某个不明的方法,而那个方法中的代码又有可能反过来调用本类中的方法,而且还有可能是在另一个线程上调用的。由于你无法确定那个不明的方法究竟会不会执行有可能导致死锁的代码,因此,需稳妥的方法就是在已经加了锁的区域中不要调用未知的代码。以上就是关于并行处理的有效的优化方式。希望对大家有所帮助。喜欢的小伙伴可以