强制C#应用程序在带有多核处理器的PC中使用单核
我正在使用Haptek People Putty播放器来开发我的C#应用程序,我在论坛上看到有人说它与多核处理器不兼容。我的应用程序在我的Core 2 Duo笔记本电脑上运行得很好,但当我尝试在四核桌面上运行它时,它会落后很多。我正在考虑为自己调查这个问题,在这种情况下,我将不得不强制我的应用程序在单个内核上运行。这在C#中可能吗?强制C#应用程序在带有多核处理器的PC中使用单核,c#,core,multiprocessor,C#,Core,Multiprocessor,我正在使用Haptek People Putty播放器来开发我的C#应用程序,我在论坛上看到有人说它与多核处理器不兼容。我的应用程序在我的Core 2 Duo笔记本电脑上运行得很好,但当我尝试在四核桌面上运行它时,它会落后很多。我正在考虑为自己调查这个问题,在这种情况下,我将不得不强制我的应用程序在单个内核上运行。这在C#中可能吗? 在C#中不太可能。好吧,我不可能知道。您需要互操作,这样就可以了 您使用多线程吗?如果没有-嗯-对不起-你做不了多少。无论如何,标准UI应用程序都不使用多核 基本
- 在C#中不太可能。好吧,我不可能知道。您需要互操作,这样就可以了
- 您使用多线程吗?如果没有-嗯-对不起-你做不了多少。无论如何,标准UI应用程序都不使用多核
基本上,不使用线程的应用程序(工作项使用线程)本质上是单核的。如果应用程序是单线程的,它将不会利用多核。但是,内核可能会在内核之间碰撞线程。我怀疑这是您的性能问题的原因
如果希望将线程绑定到单个核心(不确定是否可以保证),可能需要检查
System.Diagnostics.ProcessThread.ProcessorAffinity
属性,尽管我自己从未使用过它 如果进程
变量proc
持有您关心的进程(Process.GetCurrentProcess()
对于正在运行的进程,从另一进程的getProcesss()
或getProcessByName()
等处获取该进程。然后:
foreach(ProcessThread pt in proc.Threads)
{
pt.IdealProcessor = 0;
pt.ProcessorAffinity = (IntPtr)1;
}
IdealProcessor是单核的基于零的标识。ProcessorAffinity是位掩码,因此1允许核零,2允许核一,3允许核零和核一,4允许核二,依此类推
我将对此进行彻底的测试。。很可能这会损害您的性能,降低使用不同内核的能力,这毕竟是一个优势。我的应用程序不使用多线程。Haptek People Putty player只提供了一个DLL,所以我不知道它的作用是什么ally在里面。我不知道他们是否有多个线程。我想问题就在那里,因为我无法访问他们的代码:(我同意这一点。可能是它们的宿主。您正在声明STA线程作为VS模板吗?谢谢Ani,我将尝试看看我是否可以使用它Hey Ani,设置处理器关联使其工作!谢谢!:)可能重复[How to set processor affinity from Batch File for Windows XP?]()嗯,虽然这不是完全相同的问题,但我可以用它作为解决方案。我可能需要为我的应用程序创建一个批处理文件,而不是直接运行它。我明天会尝试看看它是否有效。谢谢Hans的链接。谢谢Jon!我昨天也尝试过这样做,它对我的应用程序有效。你说得对,它会成功的提高性能,但这是我唯一能强迫人们使用油灰的方法:(实际上,该程序使用双核处理器,但由于我在四核处理器上运行,它的速度真的变慢了。现在我把速度降到了2,它似乎工作得足够好了。@akim,编辑没有意义,因为它会引用与问题相反的当前进程。@JonHanna,当前代码段将无法编译。它使o只有第一个线程在单个进程上运行,但不是所有线程。@akim我现在看到了实际的错误,并已将其修复。这仍然无法编译:您不能迭代一个线程,您想迭代proc.threads而不是proc.threads[0],还是我遗漏了什么?