Хорошо... Я дал сайту хороший поиск и прочитал много сообщений по этой теме. Я нашел этот вопрос: Код для простого пула потоков в С# особенно полезен.
Однако, как всегда кажется, мне нужно немного меняться.
Я просмотрел пример MSDN и немного адаптировал его ко мне. Пример, на который я ссылаюсь, приведен здесь: http://msdn.microsoft.com/en-us/library/3dasc8as(VS.80,printer).aspx
Моя проблема в этом. У меня довольно простой набор кода, который загружает веб-страницу через классы HttpWebRequest
и WebResponse
и читает результаты через Stream
. Я запускаю этот метод в потоке, поскольку его нужно будет выполнять много раз. Сам метод довольно короткий, но количество раз, которое его нужно уволить (с разными данными за каждый раз), меняется. Он может быть от 1 до 200.
Все, что я прочитал, похоже, указывает, что класс ThreadPool
является основным кандидатом. Вот что становится сложнее. Мне может потребоваться, чтобы эта функция говорила 100 раз, но я могу иметь только 3 потока в большинстве случаев (для этой конкретной задачи).
Я попытался установить MaxThreads
на ThreadPool
с помощью:
ThreadPool.SetMaxThreads(3, 3);
Я не совсем уверен, что этот подход работает. Кроме того, я не хочу забивать другие веб-сайты или программы, запущенные в системе, и это будет продолжаться. Итак, ограничив # потоков на ThreadPool
, могу ли я быть уверенным, что это относится только к моему коду и моим потокам?
В примере MSDN используется подход к событиям событий и вызывает WaitHandle.WaitAll(doneEvents);
, как я это делаю.
Итак, в основе моего вопроса лежит вопрос о том, как обеспечить или указать максимальное количество потоков, которые могут быть запущены для их кода, но иметь код, который будет работать больше потоков, поскольку предыдущие заканчиваются до некоторой произвольной точки? Я решаю это правильно?
С уважением,
Джейсон
Хорошо, я добавил семафорный подход и полностью удалил код ThreadPool
. Это кажется достаточно простым. Я получил информацию от: http://www.albahari.com/threading/part2.aspx
Этот пример показал мне, как:
[текст ниже здесь копия/вставка с сайта]
A Semaphore
с емкостью одного похоже на a Mutex
или lock
, за исключением того, что Semaphore
не имеет "владельца" - это нить-агностик. Любой поток может вызывать Release
на Semaphore
, а при Mutex
и lock
только поток, который получил ресурс, может его освободить.
В этом следующем примере десять потоков выполняют цикл с выражением Sleep
в середине. A Semaphore
гарантирует, что не более трех потоков может выполнить оператор Sleep
сразу:
class SemaphoreTest
{
static Semaphore s = new Semaphore(3, 3); // Available=3; Capacity=3
static void Main()
{
for (int i = 0; i < 10; i++)
new Thread(Go).Start();
}
static void Go()
{
while (true)
{
s.WaitOne();
Thread.Sleep(100); // Only 3 threads can get here at once
s.Release();
}
}
}