Как мне спроектировать потоки для этой программы в C #? - PullRequest
0 голосов
/ 05 декабря 2011

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

Каждая задача отправляется на сервер, получает ответ, выполняет вызов на другой сервер, а затем использует ответ, чтобы сделать еще один вызов на предыдущий сервер.

Я хочу, чтобы приложение было многопоточным, поэтому, когда пользователь нажимает кнопку, оно запускает, скажем, 10 потоков, и они начинают работать.

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

Раньше, когда я пытался сделать что-то похожее, у меня получался отбой, где я обычно запускал 10 потоков каждые N секунд или около того и молился, чтобы предыдущие к тому времени были закончены.

У меня вопрос: как мне создать несколько потоков, как-то их сохранить и добавить к ним задачи по мере их завершения? Мне посоветовали добавить в список ссылки на потоки, а затем проверить, какие потоки спят, и заставить их что-то делать, но я не совсем уверен, как это сделать, хотя в основном я не уверен в правильности общего подхода эта проблема.

Спасибо!

Ответы [ 2 ]

4 голосов
/ 05 декабря 2011

Во-первых, убедитесь, что вы действительно понимаете многопоточность в .net. Я обнаружил, что это очень хороший ресурс Threading в C # .

Кроме того, новшеством в таблице является параллелизм данных в .net 4. Подробнее об этом можно прочитать здесь

Параллелизм данных облегчит вашу ситуацию (Parallel.ForEach), но я действительно советую вам ознакомиться с книгами и изучить основы. Но если невежество - блаженство, тогда параллелизм MS и данных для вас.

Если у вас нет доступа к .net 4 и, следовательно, к параллелизму данных, тогда вам понадобится очередь задач ( Класс очереди (Of T) ), некоторая блокировка для ваших потоков на безопасный доступ к нему ( блокировка ), фоновые потоки ( класс ThreadPool ) и некоторая форма сигнализации ( Сигнализация с ожиданием и импульсом ).

Бонус. Чтобы ограничить / контролировать потоки, работающие в данное время, вы также можете проверить Семафор .

Надеюсь, это поможет.

1 голос
/ 05 декабря 2011

Звучит так, будто вы запрашиваете Task Parallel Library .По сути, это помогает выполнять задачи одновременно, без необходимости самостоятельно управлять потоками.Тем не менее, вы все равно должны понимать основы многопоточного кода, чтобы вы могли структурировать свою программу так, чтобы она поддерживала параллельное выполнение задач.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...