C# 如何设置程序的CPU相关性?

C# 如何设置程序的CPU相关性?,c#,.net,visual-studio-2008,cpu,affinity,C#,.net,Visual Studio 2008,Cpu,Affinity,我有一个用C编写的程序,我正在使用VSTS 2008+.Net 3.5+Windows Vista Enterprise x86开发Windows窗体应用程序 我现在的计算机是双核CPU,我想把我的程序的CPU亲和性设置为在一个特定的CPU上运行,并释放另一个CPU来做一些其他的工作。有什么办法吗?通过编码或配置都可以 还有一点背景是,我的程序是CPU密集型的,所以我不想让它占用我计算机上的所有两个CPU资源,我想释放一个CPU,以便我可以同时快速浏览网络:- 提前感谢,, George实际上,

我有一个用C编写的程序,我正在使用VSTS 2008+.Net 3.5+Windows Vista Enterprise x86开发Windows窗体应用程序

我现在的计算机是双核CPU,我想把我的程序的CPU亲和性设置为在一个特定的CPU上运行,并释放另一个CPU来做一些其他的工作。有什么办法吗?通过编码或配置都可以

还有一点背景是,我的程序是CPU密集型的,所以我不想让它占用我计算机上的所有两个CPU资源,我想释放一个CPU,以便我可以同时快速浏览网络:-

提前感谢,,
George

实际上,除非您专门做了一些事情来使用更多的CPU,否则您的应用程序不会使用多个CPU。如果使用线程池和/或启动其他线程,则可以使用其他可用内核,否则应用程序每个默认线程只有一个,因此只使用一个CPU

转到任务管理器->流程选项卡。 查找您的程序。右键点击它。 选择Set Affinity并取消选中其中一个复选框。 这将为您释放一个处理器

要从代码中执行此操作,可以添加以下语句:

System.Diagnostics.Process.GetCurrentProcess().ProcessorAffinity = (System.IntPtr) 1;

干杯

执行此操作的Windows API函数有和。我不知道.NET,所以我不能说这些函数周围是否有包装器,但似乎有相反的建议


顺便说一句:我同意只有在非常特殊的情况下才需要这些,通常最好让操作系统调度器来处理。这是一个问题,如果你不得不问怎么做,你可能不应该这样做。

我看到一个实用程序为interbase server ibaffinity做这件事,我想它被称为。我也很想看看如何为我自己的任何一个程序做到这一点——大概你不能在运行时在可执行文件中做到这一点,你必须通过外部配置或在安装过程中做到这一点,我猜。@robsoft:这只对旧的Interbase/Firebird版本是必要的。最新版本将服务器进程分别绑定到一个处理器核心。它是开源的,因此人们可以随时查看它是如何在那里完成的。我的应用程序将使用多个CPU,因为它通过Windows Media Encoder进行录制,并对wmv格式进行实时编码-我已经测试过它,发现所有CPU资源都被Windows任务管理器占用。有没有关于如何设置CPU亲和力的想法?@Brian:对于每个核心都有缓存的系统,强制一个线程保留在一个核心上可能还是有意义的。@mghie,我同意你的看法。对我的问题有什么想法吗?@George2:好吧,看看我的答案,阅读MSDN文档如何使用函数,并使用平台调用调用它们。酷,@mghie,请看我的回答,我喜欢你的答案。有什么编程或配置方法吗?我不希望最终用户每次都这样做:-尝试以下操作:System.Diagnostics.Process.GetCurrentProcess.ProcessorAffinity=1;顺便说一下:要使用第二个,请将其设置为2,并使用两个核心,您可以将值设置为3:System.Diagnostics.Process.GetCurrentProcess.ProcessorAffinity=System.IntPtr1;忘记上次的排字:P@Gaurav,为什么使用IntPrt,为什么不使用int?@mghie,在我的问题中,1。我想我应该调用SetProcessAffinityMask而不是SetThreadAffinityMask,对吗?2.我可以从当前进程调用SetProcessAffinityMask来设置当前进程的关联性吗?或者我必须从外部工具进行设置?您可以从流程本身进行设置。最好从这篇MSDN文章开始:,它应该提供一些代码和有用的背景信息。我喜欢你的回答,关于使用System.Diagnostics.Process.GetCurrentProcess.ProcessorAffinity属性,为什么我们应该使用IntPrt,为什么不使用int?