Оптимизация кода создания потоков c#

271
17 марта 2017, 23:20

Доброго времени суток, стоит задача : вызвать метод 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 сек. Да и корректен ли данный способ реализации (через пул потоков) для данной задачи?

Answer 1

В первом случай вы создаете очень много потоков, а это дорогая операция, поэтому у вас это занимает почти 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)
    {
    }
}
READ ALSO
Renci.SshNet - ошибка

Renci.SshNet - ошибка

Код: using RenciSshNet; using Renci

369
Жизненный цикл приложений WinForms

Жизненный цикл приложений WinForms

Не знаю тонкостей технической реализации виртуальных машин под Java и C#, но знаю, что для приложений под Android выделяют понятие "жизненный цикл...

304
Выполнение метода в определенное время

Выполнение метода в определенное время

Необходимо выполнять метод в определенное время

274
Менять значения между панелями в C#

Менять значения между панелями в C#

ПриветНе доходит как поменять значения между двумя панелями во время выполнения программы

266