我有一个使用C#和.net 4.5的应用程序在Windows 8.1的英特尔酷睿i5系统上运行,但是当我发布应用程序并安装在运行在带有Intel Pentium 4单核和单线程的系统上的Windows 7 SP1上时.net 4.5.3应用程序不能完全运行。 我认为导致此问题的代码部分使用Parallel.Foreach。
我的应用程序也使用异步等待。
这是真的,Parallel.Foreach和async等待只在多线程处理器上工作吗?
如何在单核上使用此程序?如果需要替换代码我应该使用什么?
答案 0 :(得分:2)
Parallel.Foreach使用的TPL与线程而不是核心一起工作,由操作系统来安排这些线程。单核处理器只需通过单核运行与Parallel.Foreach代码相关联的线程而不会出现问题。另一方面,Async / await方法不显式创建其他线程,而是在当前同步上下文上运行,并且仅在方法处于活动状态时才在线程上使用时间。同样,单核CPU应该毫无问题地处理async / await。
话虽这么说,由于与线程创建/管理相关的额外开销,使用Parallel.Foreach实际上可能会降低性能。如果代码不受CPU限制,则Parallel.Foreach不是最好的方法。
答案 1 :(得分:0)
我希望我不会对此进行深入研究,但我只是在学习Parallel.ForEach,并想知道它在单核计算机上的表现。
对于将来可能还会对此进行研究的任何人,我想说一下,尝试使用ParallelOptions类的MaxDegreeOfParallelism属性,该属性可以像这样传递给ForEach方法:
void DoSomethingParallel()
{
ParallelOptions parOpts = new ParallelOptions();
parOpts.MaxDegreeOfParallelism = System.Environment.ProcessorCount;
object[] objs = new object[10];
Parallel.ForEach(objs, parOpts, currObj =>
{
Console.WriteLine("This is the current object: {0}", currObj.ToString());
});
}
抱歉,如果不能解决问题。我还没有尝试过。
答案 2 :(得分:0)
@JTW的回答很好,我还要添加以下内容:
如果系统只有一个处理器,则将程序转换为使用多线程实现将不会提高数据处理的速度。这是在 CPU绑定程序的情况下。例如。特定数据集的数值分析。此外,该程序不会引发异常。
但是,请考虑一个不断与文件系统交互的程序。此应用程序是 IO (输入/输出)绑定,因为它可以工作的速率取决于文件系统的性能。多线程解决方案将能够在一个任务等待输入/输出操作完成时执行处理。
PS。我知道我迟到一年才加入这个话题,但希克希望它能对某人有所帮助。