【发布时间】:2010-02-25 04:33:36
【问题描述】:
Microsoft .NET 4.0 为其框架引入了新的“并行增强”。我想知道制作使用标准 System.Threading 函数的应用程序与新的并行增强功能有什么区别。
【问题讨论】:
标签: .net multithreading parallel-processing
Microsoft .NET 4.0 为其框架引入了新的“并行增强”。我想知道制作使用标准 System.Threading 函数的应用程序与新的并行增强功能有什么区别。
【问题讨论】:
标签: .net multithreading parallel-processing
可能并行扩展和常规线程之间最重要的区别是控制流。
使用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 响应。您仍然需要为这些使用线程或异步组件。
【讨论】:
这是一个不错的频道 9 我不久前就这个话题看了:http://channel9.msdn.com/posts/philpenn/Parallel-Programming-with-NET-Parallel-Extensions/
【讨论】:
并行框架使用 .NET 线程模型,在该模型下又建立在 Windows 线程模型之上。但是,在通用框架中已经做了很多优化,以使并行库更加高效。
This blog 有更多详细信息。
【讨论】:
并行处理只是一些用于自动创建线程的精美接口。大多数任务使用并行处理扩展更容易。
【讨论】: