Давайте скажем, что im в приложении ASP.NET, WCF или веб-API, часть этого приложения, связанная с контактом с третьей стороной по пути. Id нравится делать это асинхронно или, скорее, не блокировать, чтобы пул потоков не истощался. Однако я не хочу менять весь свой код в сервисе только бит, который делает веб-вызов.Как сделать асинхронные веб-вызовы изнутри asp.net
Вот код, я написал:
public string GetSomeData()
{
Task<string> stuff = CallApiAsync();
return stuff.result; //does this block here?
}
private async Task<string> CallApiasync()
{
using (var httpClient = new HttpClient())
{
string response = await httpClient.GetStringAsync(Util.EndPoint).ConfigureAwait(false);
return response;
}
}
Я думал, что идея была следующей, но пожалуйста исправить любые неправильные представления.
Вызывающий вызов CallApi может вызывать метод, и когда он попадает в ожидании, создается задача, которая представляет собой некоторую работу, выполняемую асинхронно, но это займет некоторое время. В этот момент поток достигает ожиданий, возвращаясь к пулу потоков, чтобы сделать что-то еще, т.е. обрабатывать другой запрос. После того, как Задача завершится, линия ожидания просыпается, и код продолжается оттуда, как если бы он был синхронным.
Если это так, почему мне нужно вернуть задачу из моего apimethod. Кажется, что вызывающий вызов вызывает stuff.Result, который подразумевает, что задача может не завершиться, и результат вызова может блокироваться? Заметьте, я не хочу, чтобы вызывающий метод был асинхронным, а затем метод, который вызывает это, должен быть асинхронным и т. Д.
Что представляет собой мероприятие здесь, в моем коде?
Другой вопрос, почему мне нужно установить configureAwait в false? иначе все висит.
Хороший ответ спасибо Я теперь понимаю, где я был неправ. Я не уверен, что async - это все, что полезно вне простых демонстрационных приложений. В моем случае у нас есть фрагмент кода библиотеки, который делает веб-звонок, но перед этим у нас есть тонна бизнес-логики. Это означает, что async/await и Task будет протекать по всему моему коду. Все, что я хочу, чтобы это произошло не блокирующим образом! какой мой лучший вариант или нет бесплатного обеда, как говорится –
Ваш лучший вариант - обнять 'async'. Не рассматривайте его как * заражающий * ваш код; скорее, 'async' просто покажет вам, какие части вашего кода естественно асинхронны. –