2010-02-25 104 views
31

Microsoft .NET 4.0在其框架中引入了新的“并行增强”。我想知道做一个使用标准System.Threading函数的应用程序与新的并行增强程序之间有什么区别。线程与并行处理

回答

36

Parallel Extensions和常规线程之间最重要的区别可能是控制流。

使用new Thread(...)ThreadPool.QueueUserWorkItem创建的线程将在完全不确定的时间点终止。如果你写这样的代码:

ThreadPool.QueueUserWorkItem(() => 
    { 
     Thread.Sleep(1000); 
     Console.WriteLine("Work Finished"); 
    }); 
Console.WriteLine("Item Queued"); 

文本Item Queued将立即出现,并Work Finished将在约1秒的延迟后进行打印。

在另一方面,如果使用并行扩展写类似的东西:

Parallel.For(0, 10, i => 
    { 
     Thread.Sleep(1000); 
     Console.WriteLine("Test {0}", i); 
    }); 
Console.WriteLine("Finished"); 

什么,你会在这种情况下看到的是1秒的延迟发生任何事情之前,那么“测试”的转换消息按随机顺序排列,然后然后文本Finished

换句话说,并行运行任务实际上并不改变程序流程。它将在不同的线程上运行不同的任务,以便它们可以在多个CPU内核上执行,以提高程序的整体吞吐量,但就典型程序员而言,这些任务并不真正运行在“后台“因为他们会用线程。您不必改变程序的结构,或者在工作完成时做任何特殊的事情来通知。您无法控制里面会发生什么情况,但您确实知道该块在所有并行任务完成之前不会返回控制权。

虽然并行扩展是为这个伟大的,它承担提的是,PX是没有用的,任何当你真正需要在后台运行一个任务,如实施调度,或委托给工作线程,以保持UI响应。您仍然需要为这些使用线程或异步组件。

+0

也当你等待任务,你等待所有的子任务不像线程。错误handerling对于任务和线程来说要好得多。 – 2010-03-02 16:45:23

-2

并行处理仅仅是自动创建线程一些花哨的界面。对大多数任务使用并行处理扩展比较容易。

1

并行框架使用.NET线程模型,下面依次构建Windows线程模型。但是,在通用框架中已经完成了很多优化,以使并行库更高效。

This blog有额外的细节。