У меня есть фрагмент кода, который открывает считыватель данных, и для каждой записи (содержащей 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);
}
}
благодарит за ввод данных. я пробовал то, что вы предложили, и до сих пор не повезло. – Muxa
Ну, попробуйте сделать меньший репродукционный случай, чтобы вы могли сузить, что такое ошибка. Вы говорите, что если вы поместите контрольную точку или линию трассировки в свой метод anon, он никогда не попадет под удар? – MichaelGG