Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
179 / 175 / 14
Регистрация: 17.01.2011
Сообщений: 349
1

Асинхронные методы в стиле Erlang

03.04.2013, 15:52. Просмотров 761. Ответов 7
Метки нет (Все метки)


Уже не в первый раз встречаюсь с задачей и не знаю, как её реализовать согласно задумке.

Задача следующая:
Пользователь вводит запрос в поле, на основании введенных данных формируется массив запросов и они параллельно выполняются.

Особенности:
  • Приложение WinForm.
  • Пользователь может не дожидаться конца обработки массива.
  • При отправке нового запроса старый прекращает выполняться автоматически.

Пример, для понимания:
Менеджер вводит ФИО клиента в поле запроса и нажимает ввод, по мере выполнения приходят ответы на запросы к БД различных региональных подразделений. Видя, что ввел не то имя или фамилию, менеджер может просто поправить имя в запросе и опять нажать ввод. На экран начинают выводиться данные о правильном пользователе. Без остановки процесса вручную.

Как пытался реализовать:
Через BeginInvoke.
Просто запускал кучу методов через BeginInvoke и ждал результатов. Это решает все вопросы, за исключением ужасающей кривости самого решения: при нескольких заданиях подряд начинают выполняться десятки методов в фоне, которые невозможно контролировать. К тому же все старые задания продолжают выполняться до упора.

Через BackgroundWorker.
Отдаем в него список задач, выполняем и отдаем результат по ходу. Тут теряется асинхронность (разве что интерфейс не тормозит), а поскольку БД отдают результаты с разной задержкой, общая скорость выполнения падает в десятки раз. К тому же, прежде чем выполнить новый массив требуется дождаться полной остановки прошлого.

Буду благодарен подсказкам, как решить данный вопрос.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.04.2013, 15:52
Ответы с готовыми решениями:

SDK Яндекс Диск и асинхронные методы
Здравствуйте. Есть метод получения списка файлов в папке в SDK такой как GetListAsync. метод...

Асинхронные методы
Здравствуйте, использую VkNet, есть у меня запрос к api vk, а именно messages.search for (int i =...

Асинхронные методы контроллера. Использует ли ASP.net приложение "свой" пул потоков?
Здравствуйте вникаю в TPL, в частности интересуют асинхронные экшены в контроллере. В ASP.net MVC/...

C++ в функциональном стиле: как писать в стиле C#/LINQ (без дополнительных библиотек)?
Как писать в стиле C#/LINQ (без дополнительных библиотек)? Вот, допустим, есть простейшая задача:...

7
Эксперт Java
4072 / 3806 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
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
Эксперт Java
4072 / 3806 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
03.04.2013, 16:47 4
Цитата Сообщение от Slap Посмотреть сообщение
Но как внутри BackgroundWorker получить много потоков?
Не понял, зачем?
0
179 / 175 / 14
Регистрация: 17.01.2011
Сообщений: 349
03.04.2013, 17:27  [ТС] 5
turbanoff, обращение идет к десяткам баз. У одних баз таймаут доли секунды, у других - десятки.
В итоге, вместо того, чтобы сразу получить быструю информацию, а потом дожидаться медленных ответов, я буду ждать каждый ответ.
0
Эксперт Java
4072 / 3806 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
03.04.2013, 18:38 6
Ну создайте массив BackgroundWorker-ов, какие проблемы...
0
Master of Orion
Эксперт .NET
6079 / 4935 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.04.2013, 08:37

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

Erlang - разработчик
Ищу работу в качестве начинающего Erlang - разработчика. Собственно, к разработке на Erlang пришёл...

Установка Erlang
Добрый день, подскажите как это понять, нашел мануал по установке эрланга на Виндовс : Не...

F#, Haskel, Erlang
Есть алгоритм на C#/C++/Java (кому что по душе) поиска наибольшего и наименьшего собственного числа...

Как установить erlang из исходников?
Прошу прощения, не силён. Пробывал собрать это:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.