Вот настройка: я пытаюсь создать относительно простое приложение Winforms, считывающее устройство, использующее библиотеку FeedDotNet . У меня вопрос об использовании пула потоков. Поскольку FeedDotNet выполняет синхронные HttpWebRequests, он блокирует поток GUI. Так что лучше всего было бы сделать синхронный вызов потока ThreadPool и, пока он работает, вызывать элементы управления, которые необходимо обновить в форме. Немного грубый код:
private void ThreadProc(object state)
{
Interlocked.Increment(ref updatesPending);
// check that main form isn't closed/closing so that we don't get an ObjectDisposedException exception
if (this.IsDisposed || !this.IsHandleCreated) return;
if (this.InvokeRequired)
this.Invoke((MethodInvoker)delegate
{
if (!marqueeProgressBar.Visible)
this.marqueeProgressBar.Visible = true;
});
ThreadAction t = state as ThreadAction;
Feed feed = FeedReader.Read(t.XmlUri);
Interlocked.Decrement(ref updatesPending);
if (this.IsDisposed || !this.IsHandleCreated) return;
if (this.InvokeRequired)
this.Invoke((MethodInvoker)delegate { ProcessFeedResult(feed, t.Action, t.Node); });
// finished everything, hide progress bar
if (updatesPending == 0)
{
if (this.IsDisposed || !this.IsHandleCreated) return;
if (this.InvokeRequired)
this.Invoke((MethodInvoker)delegate { this.marqueeProgressBar.Visible = false; });
}
}
this
= основной экземпляр формы
updatesPending
= volatile int в основной форме
ProcessFeedResult
= метод, который выполняет некоторые операции с объектом Feed. Поскольку поток пула потоков не может вернуть результат, является ли это приемлемым способом обработки результата через основной поток?
Главное, что меня беспокоит, это то, как это масштабируется. Я пробовал ~ 250 запросов одновременно. Максимальное количество потоков, которые я видел, было около 53, и как только все потоки были завершены, до 21. Я помню, что в одном исключительном случае я играл с кодом, я видел, как он поднимается до 120. не так ли? Кроме того, учитывая Windows XP, я считаю, что при таком большом количестве соединений где-то возникнет узкое место. Я прав?
Что я могу сделать, чтобы обеспечить максимальную эффективность потоков / соединений?
Наличие всех этих вопросов также заставило меня задуматься, является ли это правильным случаем для использования Threadpool. MSDN и другие источники говорят, что его следует использовать для «непродолжительных» задач. Достаточно ли недолговечно 1-2 секунды, учитывая, что я на относительно быстром соединении? Что если пользователь подключен к сети 56K и один запрос может занять от 5 до 12 секунд и даже больше. Тогда пул потоков был бы эффективным решением?