Доброго времени суток, стоит задача : вызвать метод n раз использовав при этом m потоков (нужно, чтоб одновременно). Я тут набросал код
while (num < numto)
{
for (int i = 0; i < 500; i++)
{
Thread myThread = new Thread(new ParameterizedThreadStart(Get));
myThread.Start(num);
num++;
}
}
Где Get
static void Get(object x)
{
try
{
int n = (int)x;
Console.WriteLine(n);
}
catch (HttpException ex)
{
}
}
Если num = 0
и numto = 10000
, то while
закончит работу примерно через 1м и 40с, можно ли как-то оптимизировать код, что бы все запускалось быстрее? Надеюсь, что ясно выразился, если понадобится, то объясню по другому
UPD: Попытался использовать такую схему
sw.Start();
int nWorkerThreads;
int nCompletionThreads;
ThreadPool.GetMaxThreads(out nWorkerThreads, out nCompletionThreads);
Console.WriteLine("Максимальное количество потоков: " + nWorkerThreads
+ "\nПотоков ввода-вывода доступно: " + nCompletionThreads);
while (num < numto)
{
for (int i = 0; i < 500; i++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(Get), num);
num++;
}
}
sw.Stop();
Console.WriteLine((sw.Elapsed.ToString()));
While
прошел за 0,2 сек. Да и корректен ли данный способ реализации (через пул потоков) для данной задачи?
В первом случай вы создаете очень много потоков, а это дорогая операция, поэтому у вас это занимает почти 2 мин. Во втором случай вы используете готовые потоки которые уже созданы платформой .NET (пул потоков).
Для болей красивой реализации используёте Task
while (num < numto)
{
for (var i = 0; i < 500; i++)
{
Task.Run(() => Get(num));
num++;
}
}
private static void Get(int x)
{
try
{
var n = x;
Console.WriteLine(n);
}
catch (HttpException ex)
{
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Не знаю тонкостей технической реализации виртуальных машин под Java и C#, но знаю, что для приложений под Android выделяют понятие "жизненный цикл...
ПриветНе доходит как поменять значения между двумя панелями во время выполнения программы