强制C#应用程序在带有多核处理器的PC中使用单核

强制C#应用程序在带有多核处理器的PC中使用单核,c#,core,multiprocessor,C#,Core,Multiprocessor,我正在使用Haptek People Putty播放器来开发我的C#应用程序,我在论坛上看到有人说它与多核处理器不兼容。我的应用程序在我的Core 2 Duo笔记本电脑上运行得很好,但当我尝试在四核桌面上运行它时,它会落后很多。我正在考虑为自己调查这个问题,在这种情况下,我将不得不强制我的应用程序在单个内核上运行。这在C#中可能吗? 在C#中不太可能。好吧,我不可能知道。您需要互操作,这样就可以了 您使用多线程吗?如果没有-嗯-对不起-你做不了多少。无论如何,标准UI应用程序都不使用多核 基本

我正在使用Haptek People Putty播放器来开发我的C#应用程序,我在论坛上看到有人说它与多核处理器不兼容。我的应用程序在我的Core 2 Duo笔记本电脑上运行得很好,但当我尝试在四核桌面上运行它时,它会落后很多。我正在考虑为自己调查这个问题,在这种情况下,我将不得不强制我的应用程序在单个内核上运行。这在C#中可能吗?

  • 在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],还是我遗漏了什么?