Асинхронная архитектура - PullRequest
1 голос
/ 03 июня 2009

У меня есть библиотека C #, которая отображается через пользовательский интерфейс веб-страницы. Конечно, существует уровень пользовательского интерфейса, который выполняет вызовы через уровень бизнес-логики, который, в свою очередь, попадает на уровень доступа к данным для извлечения данных. На самом деле данные извлекаются через веб-сервис, который имеет возможность запрашивать данные асинхронно.

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

Учитывая трехуровневую архитектуру моего кода, это будет означать, что страницы асинхронно совершают вызовы через бизнес-уровень (и, следовательно, ускоряются за счет одновременных запросов), а веб-служба на уровне данных, в свою очередь, также делает запросы асинхронно? Логика манипулирования всеми обратными вызовами ранит мой мозг. Есть ли какие-либо ресурсы для такого подхода?

Ответы [ 3 ]

3 голосов
/ 03 июня 2009

Существует несколько полезная концепция, называемая Future<T>, которая представляет собой единицу асинхронной работы, которую предстоит выполнить в будущем.

Итак, простыми словами, в начале какого-либо действия (например, запуска приложения или загрузки страницы) вы можете определить, какие значения вам понадобятся в будущем, и позволить фоновым потокам рассчитать их для вас.

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

Некоторое обсуждение этой концепции вы можете найти здесь .

3 голосов
/ 03 июня 2009

Если вы в состоянии представить новый язык, F # ужасно хорош в написании асинхронного кода, одна из его сильных сторон, IMHO, помимо его краткости. Написание асинхронного кода выглядит почти так же, как линейный неасинхронный код!

Ссылки по теме:

Если вы не хотите вводить новый язык, вот методика использования итераторов для упрощения вашего кода:

1 голос
/ 03 июня 2009

Полагаю, у вас есть две области для обработки обратных вызовов:

  • Уровень данных -> Бизнес-объекты
  • Бизнес-объекты -> Уровень представления

Для первого я бы использовал генерацию кода для автоматического создания логики aysnc и обратного вызова для всех методов. Если у вас есть много классов, которые почти одинаковы, то это работает довольно хорошо.

Для второй области я склонен использовать привязку данных для «автоматического» обновления пользовательского интерфейса при заполнении объектов под ним.

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