2011-06-03 32 views
3

我試圖在擁有16個總物理處理器核心,32個邏輯的計算機上的進程上設置處理器關聯。之前,我們使用的是一個int,但是當您有32個邏輯核心時,它會溢出。在32+邏輯核心的系統上使用Process.ProcessorAffinity

在設置處理器關聯性仍然有效時,將使用long而不是int嗎?

請參閱下面的代碼。

try 
{ 
    string pathToExe = GetPathToExe(jobType); 

    long processorAffinity = DetermineProcessorAffinity(); 

    Process jobProcess = Process.Start(pathToExe, jobId.ToString()); 
    if (jobProcess != null) 
    { 
     jobProcess.ProcessorAffinity = new IntPtr(processorAffinity); 
    } 

} 
+2

你用長測試過嗎? – 2011-06-03 14:40:52

回答

2

IntPtr documentation

的IntPtr的類型被設計成一個 整數,其大小是 平臺特定的。也就是說,此類型的 實例預計在32位硬件和 操作系統上爲32位,在64位硬件和操作系統上爲64位。

換言之:它應該在64位系統上工作,但不能在32位系統上工作。我想你的情況不是問題。

+0

作爲一個便箋,我想指出,你不需要在Visual Studio中將你的項目設置爲64位。你需要的是一個64位操作系統。也就是說,IntPtr不會使用您的項目設置來確定硬件的位數。 – sapbucket 2015-12-29 21:35:12

3

在引擎蓋下ProcessorAffinity屬性最終將調用Win32方法SetProcessAffinityMask

此方法的目的是與多於32個處理器工作,該解決方案應該工作。

請注意,儘管此方法在32位過程中不起作用。在32位處理中,IntPtr的後備值仍然是32位。 IntPtr構造函數將以無提示方式將long值截斷爲int值,並且您將永遠無法將更多的處理器設置爲親和性。