2013-10-11 5 views
1

Я пытаюсь выполнить несколько многопоточных вычислений, но у меня возникли проблемы с управлением каждым потоком независимо.Управление потоками в C# .Net 4.5

Например, если один поток заканчивает вычисление быстрее других, как я могу его обнаружить и начать новый поток для следующего вычисления, не дожидаясь завершения всего процесса и всего остального потока для выполнения собственной задачи?

Я использую C# .net 4.5.

Благодаря

+0

Вы можете разместить образец кода? –

ответ

1

Поскольку вы используете .NET4.5, почему бы не просто использовать TPL - Параллельное библиотека задач? Он делает все, что вы пытаетесь сделать (планирование задач и управление) и многое другое.

http://msdn.microsoft.com/en-us/library/dd460717.aspx

С сайта:

Целевая Parallel Library (TPL) представляет собой набор открытых типов и интерфейсов в пространствах имен System.Threading и System.Threading.Tasks в .NET Framework 4 . Цель TPL - сделать разработчиков более продуктивными, упростив процесс добавления параллелизма и параллелизма для приложений. TPL масштабирует степень параллелизма динамически, чтобы наиболее эффективно использовать все доступные процессоры. Кроме того, TPL обрабатывает разделение работы, планирование потоков на ThreadPool, поддержку отмены, управление состоянием и другие детали низкого уровня. Используя TPL, вы можете максимизировать производительность своего кода, сосредоточившись на работе, которую ваша программа должна выполнить.

+0

Mmm Я уже использую TPL, но я запускаю заданное количество задач в цикле и жду, пока эти задачи закончатся, чтобы продолжить цикл и начать новый. Но я хочу продолжить новую задачу, когда вы закончите, не дожидаясь других. – Dragouf

+0

Просто создайте всю свою Задачу в своем цикле, сохраните объекты задачи в массиве, затем используйте Task.WaitAll() и разрешите TPL планировать задания для вас. Является ли это шаблоном Map/Reduce? Или вам нужно указать последовательность выполнения задачи самостоятельно? – AlfredBr

+0

Это на самом деле то, что я делаю. Я запускаю предопределенное количество потоков с моим циклом и жду их всех до продолжения. Но мне нужно продолжать, когда один из них закончится. – Dragouf

1

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

Если вы хотите ограничить максимальную параллельную задачу для выполнения одновременно, вы можете использовать метод Parallel.Invoke и установить MaxDegreeOfParallelism , например.

Parallel.Invoke(
new ParallelOptions() { MaxDegreeOfParallelism = 3 }, 
() => Calculation1(), 
() => Calculation2(), 
() => Calculation3(), 
); 

Parallel.Invoke принимает массив параметров и выполнять действия на нем, чтобы запустить их все параллельно, в то же время вы можете установить MaxDegreeOfParallelism установить максимальное количество вычислений запускаемых одновременно.

например.

Я полагаю, что у вас есть один и тот же метод (Рассчитать), но несколько параметров (Параметры) в качестве входных данных.

Parallel.ForEach(Parameters,new ParallelOptions() { MaxDegreeOfParallelism = 3 }, parameter=> Calculate(parameter)); 
+0

Спасибо Имран. Это кажется интересным решением. Как вы могли бы использовать Parallel.Invoke в цикле? – Dragouf

+1

Я улучшил ответ, чтобы включить цикл в paallel.invoke –

+0

Хорошо спасибо, я проверю ваше решение. – Dragouf

Смежные вопросы