2009-02-05 2 views
0

У меня есть фрагмент кода, который открывает считыватель данных, и для каждой записи (содержащей URL) загружается & обрабатывает эту страницу.Простейший способ обработки списка элементов многопоточным способом

Что это самый простой способ сделать это многопоточный, так что, скажем, есть 10 слотов, которые могут быть использованы для загрузки и обработки страниц в simultaneousy, а также слоты становятся доступными следующие строки считываются и т.д.

я не могу использовать WebClient.DownloadDataAsync

Вот что я пытался сделать, но он не работал (то есть «рабочий» никогда не бежал):

 using (IDataReader dr = q.ExecuteReader()) 
     { 
      ThreadPool.SetMaxThreads(10, 10); 
      int workerThreads = 0; 
      int completionPortThreads = 0; 
      while (dr.Read()) 
      { 
       do 
       { 
        ThreadPool.GetAvailableThreads(out workerThreads, out completionPortThreads); 

        if (workerThreads == 0) 
        { 
         Thread.Sleep(100); 
        } 
       } while (workerThreads == 0); 

       Database.Log l = new Database.Log(); 
       l.Load(dr); 

       ThreadPool.QueueUserWorkItem(delegate(object threadContext) 
       { 
        Database.Log log = threadContext as Database.Log; 
        Scraper scraper = new Scraper(); 
        dc.Product p = scraper.GetProduct(log, log.Url, true); 
        ManualResetEvent done = new ManualResetEvent(false); 
        done.Set(); 
       }, l); 
      } 
     } 

ответ

1

Вы обычно не нужно играть с потоками Max (я считаю, что он по умолчанию имеет значение ng, как 25 на proc для рабочего, 1000 для IO). Вы можете подумать о настройке Min threads, чтобы убедиться, что у вас есть хороший номер, который всегда доступен.

Вам также не нужно вызывать GetAvailableThreads. Вы можете просто начать вызов QueueUserWorkItem и позволить ему выполнять всю работу. Можете ли вы воспроизвести свою проблему, просто вызвав QueueUserWorkItem?

Вы также можете изучить Parallel Task Library, который имеет вспомогательные методы, чтобы сделать этот вид вещей более управляемым и легким.

+0

благодарит за ввод данных. я пробовал то, что вы предложили, и до сих пор не повезло. – Muxa

+0

Ну, попробуйте сделать меньший репродукционный случай, чтобы вы могли сузить, что такое ошибка. Вы говорите, что если вы поместите контрольную точку или линию трассировки в свой метод anon, он никогда не попадет под удар? – MichaelGG

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