Статья:

АСИНХРОННОЕ ПРОГРАММИРОВАНИЕ В ASP.NET MVC 4

Конференция: XVI Студенческая международная заочная научно-практическая конференция «Молодежный научный форум: технические и математические науки»

Секция: 3. Информационные технологии

Выходные данные
Сорокин А.А. АСИНХРОННОЕ ПРОГРАММИРОВАНИЕ В ASP.NET MVC 4 // Молодежный научный форум: Технические и математические науки: электр. сб. ст. по мат. XVI междунар. студ. науч.-практ. конф. № 9(16). URL: https://nauchforum.ru/archive/MNF_tech/9(16).pdf (дата обращения: 19.09.2020)
Лауреаты определены. Конференция завершена
Эта статья набрала 0 голосов
Мне нравится
Дипломы
лауреатов
Сертификаты
участников
Дипломы
лауреатов
Сертификаты
участников
на печатьскачать .pdfподелиться

АСИНХРОННОЕ ПРОГРАММИРОВАНИЕ В ASP.NET MVC 4

Сорокин Алексей Александрович
студент 4 курса, кафедра ИТ, ДИТИ НИЯУ МИФИ, РФ, Ульяновская область, г. Димитровград
Белянина Дарья Николаевна
научный руководитель, ассистент, ДИТИ НИЯУ МИФИ, РФ, Ульяновская область, г. Димитровград

 

Язык программирования C# не стоит на месте, и за свою короткую историю вдохнул жизнь в многочисленные коммерчески успешные и полезные с точки зрения потребителя проекты, такие как браузер Opera, Banshee, Beagle, F-spot, MonoDevelop, Tomboy и многие другие. С каждой новой версией язык приобретает новые очертания, открывает новые возможности, одним словом, развивается.

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

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

В программировании понятие «асинхронность» тесно связано с многопоточностью. Таким образом, когда необходим параллелизм операций, часто применяется модель нитей и процессов. Но она подходит для большого объема вычислений, так как несет в себе значительные накладные расходы, связанные со сменой контекста синхронизации, памятью и т. п., которые перекладываются на операционную систему.

В ИТ-сфере растет популярность ASP .NET MVC в сфере веб-приложений. До ASP.NET MVC 4 у программистов были такие средства как асинхронные контроллеры, асинхронный javascript и XML(AJAX) или специальные классы, способные переводить действия в отдельные потоки, например, класс BackgroundWorker.

Рассмотрим пример: необходимо разработать страницу, которая сформирует сведения о наличии (отсутствии) у юридического лица задолженности в ФНС (федеральная налоговая служба) и сведения, содержащиеся в ЕГРЮЛ (единая государственная регистрация юридических лиц). Для этого имеется два метода, которые посылают соответствующие запросы: sendXmlTaxInfo и sendXmlEGRInfo. Аргумент-строка содержит xml-разметку, несущую в себе информацию о запрашиваемом юридическом лице, например:

<Document ИдЗапрос=”6F9619FF-8B86-D011-B42D-00CF4FC964FF” >

<ИННЮЛ>7726297700</ИННЮЛ>

<ОГРН>1027739280557</ОГРН>

</Document>

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

До выхода версии C# 5 можно было воспользоваться асинхронным контроллером, а теперь – асинхронной моделью на основе событий:

public class SendRequestController : AsyncController

{

public void SendRequestFNSAsync (string inxml)

{

AsyncManager.OutstandingOperations.Increment(2);

sendXmlTaxInfoComplited += (sender, e) =>

{

AsyncManager.Parameters["TaxInfo"] = e.Value;

AsyncManager.OutstandingOperations.Decrement();

};

sendXmlTaxInfoAsync(inxml);

sendXmlEGRInfoComplited += (sender, e) =>

{

AsyncManager.Parameters["EGRInfo"] = e.Value;

AsyncManager.OutstandingOperations.Decrement();

};

sendXmlEGRInfoAsync(inxml);

}

 

public ActionResult SendRequestFNSCompleted(string TaxInfo, string EGRInfo)

{

ULInfoModel ul = new ULInfoModel();

ul.generateInfo(TaxInfo, EGRInfo);

return View("TaxEGRInfo", ul);

}

}

Контроллер в обязательном порядке необходимо унаследовать от AsyncController, он позволит выполнять обработку асинхронных запросов. Можно заметить, что все методы имеют две части выполнения, которые обязательно заканчиваются словами Async и Completed. Все методы Async в пределах выполняемого метода запускаются одновременно. По завершении соответствующего метода срабатывает обработчик Completed. Класс AsyncManager — вспомогательный класс. Свойство OutstandingOperations сообщает ASP.NET о количестве операций в очереди — в примере выполняются две операции, посылаются два запроса. Для передачи результатов запросов используется словарь Parameters. Таким образом, время выполнения стало значительно меньше, благодаря асинхронным вызовам.

Ниже рассмотрена задача на уровне языка.

public class SendRequestController : Controller

{

public async Task<ActionResult> SendRequestFNSAsync()

{

Task<string> getRequest_1 = sendXmlTaxInfo(inxml);

Task<string> getRequest_2 = sendXmlEGRInfo(inxml);

ULInfoModel ul = new ULInfoModel();

string taxInfo = await getRequest_1;

string EGRInfo = await getRequest_2;

ul.generateInfo(taxInfo, EGRInfo);

return View("TaxEGRInfo", ul);

}

}

Для написания асинхронного метода нужно использовать два ключевых слова:

  1. async для объявления метода асинхронным. При этом возвращаемым значением должно быть: Task<ResultClass>, если результатом исполнения метода является класс ResultClass; Task, если метод не должен ничего возвращать; void, если есть необходимость написать асинхронный обработчик событий;
  2. await, чтобы объявить компилятору ожидание окончания выполнения метода;

Так как результатом запроса должна быть строка string, содержащая xml-разметку, объявляется задача, которая гарантирует вернуть тип string следующим кодом:

Task<string> getRequest_1 = sendXmlTaxInfo(inxml);

Следующий за этим объявлением код беспрепятственно исполняется параллельно с запросом, пока не встретит команду:

string taxInfo = await getRequest_1;

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

Таким образом, код получился проще, короче и читабельнее. Главное преимущество второго варианта — простота написания, отладки и сопровождения в сложных приложениях. Здесь используется асинхронная модель на основе задач — самое современное средство для разработки асинхронных методов.

 

Список литературы:

  1. Дэвис А. Асинхронное программирование в C#5 (Async in C# 5.0) [Текст]: Учеб. пособие / А. Дэвис. — М.: ДМК Пресс, 2012. — 120 с.
  2. Сандерсон С. ASP .NET MVC Framework с примерами на C# для профессионалов [Текст]: Учеб. пособие / С. Сандерсон. — М.: ООО «И.Д. Вильямс», 2010. — 560 с.
  3. Чедвик Дж. ASP.NET MVC 4: разработка реальных веб-приложений с помощью ASP.NET MVC (Programming ASP.NET MVC 4: Developing Real-World Web Applications with ASP.NET MVC) [Текст]: Учеб. пособие / Дж. Чедвик — М.: ООО «И.Д. Вильямс», 2013. — 432 с.