2009-04-04 10 views
3

Ich habe eine Multi-Core-CPU, aber die .net App, die ich schrieb, verwendet nur einen der Kerne. Wie kann ich mehr als einen Kern verwenden, wenn diese Option verfügbar ist?.net-Anwendung Multithreading

Antwort

7

Dies geschieht nicht kostenlos. Die Verwendung mehrerer Kerne erfordert die Verwendung mehrerer Threads. Sie müssen Threading-Unterstützung explizit zu Ihrem Programm hinzufügen, um mehrere Kerne gleichzeitig zu verwenden.

Hier ist ein großartiger Artikel, der untersucht, wie Sie mehrere Kerne mit verwaltetem Code mithilfe der parallelen Taskbibliothek (auch als parallel extensions framework bekannt) nutzen können.

http://msdn.microsoft.com/en-us/magazine/cc163340.aspx

4

Sie können die Microsoft Parallel Extensions to .NET Framework 3.5 ausprobieren wie JaredPar erwähnt, oder eine Multi-Thread-Version des Programms selbst erstellen.

Ich möchte hier ein konkreteres Beispiel dazu hinzufügen, wie einfach es ist, eine "for-Schleife" aus einem bestehenden Programm zu konvertieren, um die System.Threading.Parallel von der parallelen Erweiterung zu verwenden. Für eine for-Schleife, die zwischen 0 bis maxnum für jede Primzahl überprüfen:,

System.Threading.Parallel.For(0, maxNum + 1, x => IsPrime(x)); 

Leicht ist es nicht?

Ich führe auch einen einfachen Benchmark über Leistungsverbesserung von System.Parallel. Ich hoffe, dass es den Peers egal ist, wenn ich einen Link zu meinem Blog here poste.

alt text

0

@JaredPar gibt ein excellent answer. Unter bestimmten Umständen ist es jedoch nicht sinnvoll, Code neu zu schreiben, um Multi-Threading zu sein. Multithreaded-Code ist komplizierter und fügt eine ganze Reihe zusätzlicher Arten von Bugs hinzu, mit denen man ringen kann.

Im einfachen Fall einer Desktop-Anwendung lohnt es sich jedoch manchmal, den zweiten Kern einer Dual-Core-Maschine frei zu lassen, damit das Betriebssystem es zum Neuzeichnen des Bildschirms für andere laufende Anwendungen verwenden kann der Virenscanner usw.

Nicht die Antwort, die Sie besonders hören wollten, aber in bestimmten Fällen trotzdem eine pragmatische.

0

Verteilen Sie Ihre zeitintensiven Jobs an mehrere Threads.

Der vorgeschlagene Weg für die Multitreheading ist ThreadPool.

Eine Probe von Threadpool von MSDN:

using System; 
using System.Threading; 
public class Example { 
    public static void Main() { 

     // Queue the task. 
     ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc)); 

     Thread.Sleep(1000); 

     Console.WriteLine("Main thread exits."); 
    } 

    // This thread procedure performs the task. 
    static void ThreadProc(Object stateInfo) { 

     // No state object was passed to QueueUserWorkItem, so 
     // stateInfo is null. 
     Console.WriteLine("Hello from the thread pool."); 
    } 
}