У меня есть два варианта кода, которые будут представлены ниже.
Задача кода заключается в следующем: у меня есть два URL-адреса, по которым я делаю HTTP-запрос Get, и Я хочу получить оттуда контент.
В первом случае я использую Task.WhenAll и передаю два асинхронных вызова метода, ожидая выполнения моих задач. выполняться параллельно и в разных потоках.
Но судя по выводу, все они выполняются в основном потоке, его id = 1.
В во втором случае я использую await и ожидаю, что мои задачи будут выполняться последовательно, но одновременно.
Хотя сама суть await заключается в ожидании выполнения операции без блокировки основного потока.
Поясните, пожалуйста, где я ошибаюсь и какой вариант предпочтительнее для такой задачи?
Метод (один и тот же в обоих случаях)
< pre class="lang-cs Prettyprint-override">public static async Task FetchDataFromUrl(string url)
{
await Console.Out.WriteLineAsync(Thread.CurrentThread.ManagedThreadId.ToString());
try
{
using (HttpClient client = new HttpClient())
{
return await client.GetStringAsync(new Uri(url));
}
}
catch (Exception ex)
{
await Console.Out.WriteLineAsync(ex.Message);
throw;
}
}
Вызов метода №1
string url1 = "https://jsonplaceholder.typicode.com/posts/1";
string url2 = "https://jsonplaceholder.typicode.com/comments/1";
var results = await Task.WhenAll(FetchDataFromUrl(url1), FetchDataFromUrl(url2));
Вызов метода №2
string url1 = "https://jsonplaceholder.typicode.com/posts/1";
string url2 = "https://jsonplaceholder.typicode.com/comments/1";
List results = new List
{
await FetchDataFromUrl(url1),
await FetchDataFromUrl(url2),
};
Подробнее здесь: https://stackoverflow.com/questions/786 ... nous-opera
Объясните разницу между двумя подходами к вызову асинхронных операций ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение