179 / 175 / 14
Регистрация: 17.01.2011
Сообщений: 349
|
|
1 | |
Асинхронные методы в стиле Erlang03.04.2013, 15:52. Просмотров 761. Ответов 7
Метки нет Все метки)
(
Уже не в первый раз встречаюсь с задачей и не знаю, как её реализовать согласно задумке.
Задача следующая: Пользователь вводит запрос в поле, на основании введенных данных формируется массив запросов и они параллельно выполняются. Особенности:
Пример, для понимания: Менеджер вводит ФИО клиента в поле запроса и нажимает ввод, по мере выполнения приходят ответы на запросы к БД различных региональных подразделений. Видя, что ввел не то имя или фамилию, менеджер может просто поправить имя в запросе и опять нажать ввод. На экран начинают выводиться данные о правильном пользователе. Без остановки процесса вручную. Как пытался реализовать: Через BeginInvoke. Просто запускал кучу методов через BeginInvoke и ждал результатов. Это решает все вопросы, за исключением ужасающей кривости самого решения: при нескольких заданиях подряд начинают выполняться десятки методов в фоне, которые невозможно контролировать. К тому же все старые задания продолжают выполняться до упора. Через BackgroundWorker. Отдаем в него список задач, выполняем и отдаем результат по ходу. Тут теряется асинхронность (разве что интерфейс не тормозит), а поскольку БД отдают результаты с разной задержкой, общая скорость выполнения падает в десятки раз. К тому же, прежде чем выполнить новый массив требуется дождаться полной остановки прошлого. Буду благодарен подсказкам, как решить данный вопрос.
0
|
|
03.04.2013, 15:52 | |
SDK Яндекс Диск и асинхронные методы
C++ в функциональном стиле: как писать в стиле C#/LINQ (без дополнительных библиотек)? |
|
![]() |
|
03.04.2013, 15:57 | 2 |
Например, с помощью BackgroundWorker:
при нажатии на Enter, нужно проверить - запущен ли уже воркер, если запущен то отменить его выполнение, и запустить новый запрос. И переработать метод, чтобы он поддерживал отмену: например, после получения очередной записи проверять, не была ли задача отменена.
0
|
179 / 175 / 14
Регистрация: 17.01.2011
Сообщений: 349
|
|
03.04.2013, 16:03 [ТС] | 3 |
turbanoff, тогда менеджер должен ждать, пока не прекратится последнее выполняемое задание. Как вариант, можно конечно давать команду остановиться и создавать новый BackgroundWorker. Но как внутри BackgroundWorker получить много потоков?
0
|
179 / 175 / 14
Регистрация: 17.01.2011
Сообщений: 349
|
|
03.04.2013, 17:27 [ТС] | 5 |
turbanoff, обращение идет к десяткам баз. У одних баз таймаут доли секунды, у других - десятки.
В итоге, вместо того, чтобы сразу получить быструю информацию, а потом дожидаться медленных ответов, я буду ждать каждый ответ.
0
|
Master of Orion
![]() |
|
04.04.2013, 02:06 | 7 |
Slap, посмотрите в сторону TPL. Возможно, в самом воркере можно будет распараллелить задачи, как вы и хотите.
1
|
179 / 175 / 14
Регистрация: 17.01.2011
Сообщений: 349
|
|
04.04.2013, 08:37 [ТС] | 8 |
turbanoff,
Можно и гвозди кувалдой забивать ![]() Psilon, Спасибо за наводку, для меня это новая информация. Пойду читать MSDN.
0
|
04.04.2013, 08:37 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь. Erlang - разработчик Установка Erlang F#, Haskel, Erlang Как установить erlang из исходников? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |