C # .net для () шаг? - PullRequest
       4

C # .net для () шаг?

5 голосов
/ 07 декабря 2010

У меня есть функция, которая обрабатывает список из 6100 элементов списка. Код раньше работал, когда в списке было всего 300 элементов. Но мгновенно вылетает с 6100. Есть ли способ, которым я могу перебрать эти 6100 элементов, скажем, 30 одновременно, и запустить новый поток на элемент?

    for (var i = 0; i < ListProxies.Items.Count; i++)
    {
        var s = ListProxies.Items[i] as string;
        var thread = new ParameterizedThreadStart(ProxyTest.IsAlive);
        var doIt = new Thread(thread) { Name = "CheckProxy# " + i };
        doIt.Start(s);
    }

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

10 голосов
/ 07 декабря 2010

Вам действительно нужно создать новую ветку для каждого рабочего элемента?Если в этом нет реальной необходимости (если да, скажите, пожалуйста, почему), я настоятельно рекомендую вам использовать Managed Thread Pool .Это даст вам требуемые преимущества параллелизма, но без требований к ресурсам (а также затрат на создание, разрушение и огромных переключений контекста) для запуска тысяч потоков.Если вы работаете в .NET 4.0, вы также можете рассмотреть возможность использования параллельной библиотеки задач .

Например:

for (var i = 0; i < ListProxies.Items.Count; i++)
{
   var s = ListProxies.Items[i] as string;
   ThreadPool.QueueUserWorkItem(ProxyTest.IsAlive, s);       
}

В другой заметке я хотел бысерьезно подумайте о переименовании метода IsAlive (который выглядит как логическое свойство или метод), поскольку:

  1. Он явно имеет void IsAlive(object) подпись.
  2. Он имеет видимые побочные эффекты(из вашего комментария, что он «увеличивает индикатор выполнения и добавляет« рабочий »прокси в новый список»).
3 голосов
/ 07 декабря 2010

Существует ограничение на количество потоков, которые вы можете создавать.6100 потоков кажутся немного излишними.

Я согласен выиграть Ани, вы должны изучить процесс ThreadPool или даже продюсер / потребитель в зависимости от того, что вы пытаетесь достичь.

Существует довольно много процессов для обработки многопоточных приложений, но, не зная, что вы делаете в начале, на самом деле нет никакого способа рекомендовать какой-либо подход, кроме процесса ThreadPool или Producer / Consumer (Queues with SyncEvents),

В любом случае, вы действительно должны стараться свести количество потоков к минимуму, в противном случае вы рискуете получить блокировки потоков, спин-блокировки, блокировки ожидания, мертвые блокировки, условия гонки, кто знает что и т. Д..

Если вам нужна хорошая информация о многопоточности в C #, прочитайте книгу Параллельное программирование в Windows Автор Джо Даффи это действительно полезно.

...