Многопоточность приложений .net - PullRequest
3 голосов
/ 04 апреля 2009

У меня многоядерный процессор, но написанное мною приложение .net использует только одно из ядер. как я могу заставить его использовать более одного ядра, когда эта опция доступна.

Ответы [ 4 ]

7 голосов
/ 04 апреля 2009

Это не происходит бесплатно. Использование нескольких ядер требует использования нескольких потоков. Вам придется явно добавить поддержку потоков в вашу программу, чтобы использовать несколько ядер одновременно.

Вот отличная статья, в которой рассказывается о том, как использовать преимущества нескольких ядер в управляемом коде с помощью параллельной библиотеки задач (также известной как framework для параллельных расширений ).

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

4 голосов
/ 04 апреля 2009

Вы можете попробовать Microsoft Parallel Extensions для .NET Framework 3.5 , как упоминал JaredPar, или создать многопоточную версию своей программы самостоятельно.

Я хотел бы добавить более конкретный пример о том, как легко преобразовать цикл for из существующей программы для использования System.Threading.Parallel из Parallel Extension. Для цикла for, который проверяет каждое простое число от 0 до maxnum:

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

Легко, не правда ли?

Я также провожу простой тест производительности системы System.Parallel. Я надеюсь, что ТАКИЕ коллеги не против, если я опубликую ссылку на свой блог здесь .

alt text

0 голосов
/ 11 октября 2012

Отправляйте ваши трудоемкие задания в несколько потоков.

Рекомендуемый способ для многопоточности - использование ThreadPool.

Образец ThreadPool из 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.");
    }
}
0 голосов
/ 06 апреля 2009

@ JaredPar дает отличный ответ . Тем не менее, при некоторых обстоятельствах может не стоить переписывать код, чтобы он был многопоточным. Многопоточный код более сложен и добавляет целый ряд дополнительных типов ошибок, с которыми приходится бороться.

Однако в простом случае настольного приложения иногда стоит оставить второе ядро ​​двухъядерной машины свободным, чтобы операционная система могла использовать его для таких вещей, как перерисовка экрана для других приложений, запуск антивирусный сканер и т. д.

Не тот ответ, который вы особенно хотели услышать, но, тем не менее, прагматичный в некоторых случаях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...