Независимая очередь задач активности MonoDroid?

У меня есть приложение Monodroid, которое выполняет много веб-запросов. Я делаю запросы от действий. Из-за этого мне нужна очередь для обработки моих запросов вне моей деятельности. Это делается для того, чтобы избежать одновременного выполнения нескольких запросов.

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

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

В моем случае запросы, которые я делаю, находятся в разных функциях, выполняющих разные действия, поэтому обратные вызовы для обновления пользовательского интерфейса не всегда являются одними и теми же функциями. Также функции, которые я использую для выполнения запросов, имеют разные параметры. Я не уверен, что эти моменты усложняют/упрощают создание решения этой проблемы, но я предполагаю, что мне нужно будет переработать большую часть моего кода.


person startupsmith    schedule 21.06.2012    source источник
comment
Несколько вопросов: Почему ваши WebRequests блокируют ThreadPool? Это, вероятно, симптом синхронного выполнения запросов... и подход, который не очень хорошо масштабируется. Возможно, вам следует изучить один из нескольких способов выполнения асинхронных запросов. Кроме того, вы уверены, что не превышаете максимальное количество запросов на домен?   -  person spender    schedule 22.06.2012
comment
Да, веб-запросы блокируются, если я это делаю. И запросы к тому же домену, так что, вероятно, это так. То, что я определил, мне, вероятно, нужно каким-то образом управлять запросами по всем моим действиям, чтобы они выполнялись по одному, и если действие закрывается/уничтожается, любые запросы, которые еще не завершены, отменяются.   -  person startupsmith    schedule 22.06.2012


Ответы (1)


а) Используйте асинхронные методы для выполнения ваших запросов, чтобы вы не вешали потоки пула потоков.

б) Увеличьте лимит подключений для доменов, с которых вы запрашиваете.

ServicePointManager.FindServicePoint(uri).ConnectionLimit=10000;
person spender    schedule 21.06.2012
comment
Спасибо за Ваш ответ. Есть ли шанс, что вы могли бы указать мне пример асинхронного метода с веб-запросом? Также возможно ли, что хост домена может ограничить количество одновременных подключений на стороне сервера? - person startupsmith; 22.06.2012
comment
Найдите примеры, содержащие HttpWebRequest.BeginGetrequest. Никто не знает политику сайта, который вы парсите, кроме владельца. Если вы собираетесь взломать сайт, подумайте о том, чтобы попросить разрешения. Некоторые сайты заблокируют вас, если вы пойдете слишком быстро. - person spender; 22.06.2012