Попробуйте это решение:
static void Main(string[] args)
{
for (int i = 0; i < 100; i++)
{
Task t = new Task(doWork, i);
t.Start();
}
Console.ReadLine();
}
static void doWork(object i)
{
Console.WriteLine(i + ": started");
Thread.SpinWait(20000000); // It depends on what doWork actually does whether SpinWait or Sleep is the most appropriate test
//Thread.Sleep(1000);
Console.WriteLine(i + " done");
}
С задачами у вас есть лучший способ управления вашими рабочими элементами и дополнять их параметрами, которые могут повысить производительность. По умолчанию TaskScheduler
для задач использует ThreadPool
для постановки рабочих элементов в очередь. (Прочитайте нижнюю часть этого ответа для получения дополнительной информации о задачах.)
Итак, чтобы ответить на вопрос, нам нужно знать, что на самом деле делает doWork
:-) Но в целом Task
будет хорошим выбором и хорошей абстракцией.
Параллельно foreach
Если вы используете цикл для порождения заданий и выполняете параллелизм данных , тогда параллельный foreach может выполнить эту работу:
Parallel.For(0, 500, i => doWork(i));
Ссылки:
На комментарий от спонсора
http://msdn.microsoft.com/en-us/library/dd537609.aspx
Задачи предоставляют два основных преимущества:
1) Более эффективное и масштабируемое использование системных ресурсов.
За кулисами задачи ставятся в очередь в ThreadPool, который был
усилены алгоритмами (такими как восхождение на холм), которые определяют и
настроить количество потоков, которое максимизирует пропускную способность. Это делает
Задачи относительно легки, и вы можете создать много из них, чтобы
включить мелкозернистый параллелизм. В дополнение к этому, широко известный
алгоритмы кражи работ используются для обеспечения балансировки нагрузки.
2) Больше программного управления, чем возможно для потока или рабочего элемента.
Задачи и построенная на них структура предоставляют богатый набор API
поддержка ожидания, отмена, продолжения, надежное исключение
обработка, подробный статус, пользовательское планирование и многое другое.
Обновленный ответ
Ну, к сожалению, это плохой API, потому что он не позволяет делать это асинхронно. Вероятно, он идет медленно, потому что вы одновременно запускаете много соединений (или слишком мало).
Попробуйте это:
var jobs = new[] { 1, 2, 3};
var options = new ParallelOptions { MaxDegreeOfParallelism = 3 };
Parallel.ForEach(jobs, options, i => doWork(i));
И поэкспериментируйте со значением MaxDegreeOfParallelism
.