Я знаю, что подобные вопросы задавались, но я борюсь с концепциями асинхронного программирования в .net.Как веб-разработчик, я понял, что асинхронный вызов функций не приводит к блокировке пользовательского интерфейса, и вы можете делать другие вещи.Но теперь я на другой стороне, пишу сервис C # Web API для извлечения информации из базы данных и выполнения некоторых вычислений.Я сделал функции в контроллере асинхронными, добавив ключевое слово async в заголовок функции, который я наивно думал, что это конец, но затем он говорит мне, что мне нужно использовать ключевое слово await в функции.Так что я понял, как это сделать (я много читал к этому моменту), но я не понимаю, ПОЧЕМУ мне нужно это делать, а также КОГДА.Например, у меня есть веб-метод, как показано ниже, где он вызывает две другие функции, но только одна вызывается с await.Это плохо?Это будет только неблокирующая часть времени?Затем я создал другую тестовую функцию, у которой нет ключевого слова await, и она работала нормально (нижний код).
[HttpPost]
public async Task<IHttpActionResult> CalculateBMIAsync([FromBody]MeasureInput patientData)
{
string results = String.Empty;
MeasureReturn returnVal = null;
try
{
string msgInvalid = await Translators.validatePatMonthXML(patientData);
if (String.IsNullOrEmpty(msgInvalid))
{
results = await measureProcessor.CalculateBMI(patientData);
}
else
return new BadRequestWithInfoResult(Translators.CreateErrorXML(new Exception(msgInvalid)));
}
catch (Exception ex)
{
return new BadRequestWithInfoResult(Translators.CreateErrorXML(ex));
}
return Ok<MeasureReturn>(returnVal);
}
Пример метода веб-API, который работал асинхронно при вызове с помощью jquery (здесь не используется await):
[HttpPost]
public async Task<IHttpActionResult> CalculateTest()
{
long d = 0;
for (long i = 0; i < 2000000000; i++)
{
d = i;
}
string returnVal = d.ToString();
return Ok(returnVal);
}
Телефонный код:
$('#btn1').click(function () {
console.log('Ajax request');
$.ajax({
url: 'http://localhost:53312/api/Measures/CalculateTest',
type: 'POST',
success: function (data) {
$('#result1').html('async request finished');
}
})
});