2013-12-17 30 views
3

背景
從歷史上看,我沒有寫太多的線程相關的代碼。我對這個過程很熟悉,我可以使用System.Threading來做需要時我需要做的事情。然而,我的大部分經驗都被困在.Net 2.0世界(唉!),我需要一些幫助在最新版本的.Net中執行一項非常簡單的任務。作爲低優先級的CPU操作執行並行for循環的最簡單方法是什麼?

我需要編寫一個簡單的並行作業,但我更願意將它作爲低優先級任務執行,不會使我的PC停滯不前。

下面是一個簡單的並行示例,演示了我試圖完成的工作類型。在這個例子中,如果新值大於最後發現的最大隨機數,我將隨機數存儲起來。

請理解,這個例子的要點是嚴格證明我有一個計算,我希望重複執行,比較和存儲。我明白需要變量鎖定,我也知道這個代碼並不完美。然而,這是我需要完成的事情的一個非常簡單的例子。如果你運行這個代碼,你的CPU會停下來。

int i = 0; 
ThreadSafeRNG r = new ThreadSafeRNG(); 
ParallelOptions.MaxDegreeOfParallelism = 4; //Assume I have 8 cores. 
Parallel.For(0, Int32.MaxValue, (j, loopState) => 
{ 
    int k = r.Next(); 
    if (k > i) k = i; 
} 

如何以並行方式執行此項工作並將其作爲低優先級CPU任務執行?上述機制通過標準的for-loop提供了巨大的性能改進。但是,成本一直是我無法使用我的電腦,即使設置了MaxDegreeOfParallelism選項。

我該怎麼辦?

+0

不是重複的,但相關的問題[here](http://stackoverflow.com/questions/13089003/set-priority-for-parallel-for-loop) –

+0

謝謝@ledbutter。我認爲這是我發現的使用'ParallelOptions'對象的第一篇文章。但是,我發現我需要將值設置爲非常低,才能看到差異。即使如此,我的電腦速度明顯較慢,但確實可用。這是一種非選擇。 – RLH

+1

順便說一下,'Random'上的非靜態方法不是線程安全的 – harold

回答

2

由於Parallel.For使用ThreadPool線程,因此無法將線程的優先級設置爲低。但是你可以改變整個應用程序

Process currentProcess = Process.GetCurrentProcess(); 
ProcessPriorityClass oldPriority = currentProcess.PriorityClass; 

try 
{ 
    currentProcess.PriorityClass = ProcessPriorityClass.BelowNormal; 

    int i = 0; 
    ThreadSafeRNG r = new ThreadSafeRNG(); 
    ParallelOptions.MaxDegreeOfParallelism = 4; //Assume I have 8 cores. 
    Parallel.For(0, Int32.MaxValue, (j, loopState) => 
    { 
     int k = r.Next(); 
     if (k > i) k = i; 
    } 
} 
finally 
{ 
    //Bring the priority back up to the original level. 
    currentProcess.PriorityClass = oldPriority; 
} 

的優先級如果你真的不想要你的整個應用程序的優先級,以降低與像WCF某種形式的IPC的結合這一招並在運行的速度慢長時間運行的操作第二個過程,根據需要啓動並殺死。

+0

謝謝斯科特,這工作完美。 – RLH

0

使用Parallel.For方法,您不能設置線程優先級,因爲它們是ThreadPool線程。

最好的辦法是設置ParallelOptions.MaxDegreeOfParallelismProcessorCount - 1,這樣你有一個免費的內核做其他事情(比如處理GUI)。

相關問題