С Новым годом! Форум программистов, компьютерный форум, киберфорум
C#: API, боты
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
2 / 2 / 0
Регистрация: 07.04.2015
Сообщений: 358

API запрос, асинхронность

28.02.2020, 17:33. Показов 3060. Ответов 20

Студворк — интернет-сервис помощи студентам
Здравствуйте. С асинхронными запросами познакомился только сегодня. Тема, судя по всему, нелегкая. Есть пример кода, который синхронно работал исправно. Но очень тормозилось выполнение кода из-за ожидания ответа одним запросом.
Код(суть вопроса только в части кода с запросом и ответом):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
 public static Task  depth_request(string symbol, int limit=100)
        {
            string api = "https://api.binance.com";
            string options = "/api/v1/depth";
            string options2 = "?symbol=";
            string _symbol = symbol;
            string options3 = "&limit=";
            limit = rounding(limit);
            string _limit=limit.ToString();
            api += options;
            api += options2;
            api += _symbol;
            api += options3;
            api += _limit;
 
 
 
            int exeption=0;
            int index = 0;
            double volume = 0;
 
            string rt;
 
            WebRequest request = WebRequest.Create(api);
 
            WebResponse response = request.GetResponse();
 
            Stream dataStream = response.GetResponseStream();
 
            StreamReader reader = new StreamReader(dataStream);
 
            rt = reader.ReadToEnd();
 
            var quotes = JsonConvert.DeserializeObject<Quotes>(rt);
 
 
          
 
 
            try
            {
                for (int j = 0; j < limit - 1; j++)
                {
                    for (int i = 0; i < 2; i++)
                    {
                        exeption = j;
                        if (quotes.Bids[j][i] > volume)
                        {
                            volume = quotes.Bids[j][i];
                            index = j + 1;
                        }
 
                    }
                }
            }
 
            catch (System.IndexOutOfRangeException)
            {
                for (int j = 0; j < exeption; j++)
                {
                    for (int i = 0; i < 2; i++)
                    {
 
                        if (quotes.Bids[j][i] > volume)
                        {
                            volume = quotes.Bids[j][i];
                            index = j + 1;
                        }
 
                    }
                }
 
 
            }
            
 
            return new Dictionary<int, double>() { { index, volume } };
 
 
        }
Понятно, что код не выполнится. Как его перестроить, чтоб запросы выполнялись асинхронно и при этом я смог бы вернуть из этой функции словарь?
И еще один вопрос: могу ли я выполнять синхронную функцию в блоке Main асинхронно? То есть, если в функции находится один запрос, то вызов этой функции и будет, по сути, одним запросом. Или нет?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.02.2020, 17:33
Ответы с готовыми решениями:

Асинхронность в Web API
У меня есть проект, который представляет собой REST API для управлением локальным хранилищем (по сути просто IEnumerable объект) Это...

API запрос
вот параметры http://shop.digiseller.ru/xml/shop_categories.asp Метод:POST Формат запроса: &lt;digiseller.request&gt; ...

Создать API запрос
Как создать API запрос такого плана?

20
800 / 583 / 207
Регистрация: 21.02.2019
Сообщений: 2,095
28.02.2020, 18:16
..а как вы можете вернуть словарь, если результата запроса еще нет, и соответственно нет объекта quotes ..?
0
2 / 2 / 0
Регистрация: 07.04.2015
Сообщений: 358
28.02.2020, 18:30  [ТС]
Согласен, логично. Как тогда можно организовать асинхронность кода, описанного в этой функции?
0
 Аватар для imcavs™
-2 / 24 / 8
Регистрация: 19.02.2012
Сообщений: 446
28.02.2020, 18:54
Для начала, давайте начнём с того, что Вы используете api.


Реализуйте функцию, которая будет возвращать словарь. Например:
C#
1
2
3
4
5
List<Item> list = await GetListAsync();
 
private Task<List<Item>> GetListAsync(){
    return Task.Run(() => manager.GetList());
}
0
2 / 2 / 0
Регистрация: 07.04.2015
Сообщений: 358
28.02.2020, 19:27  [ТС]
Ой-ой-ой...Как все запущено в моем случае(речь о асинхронной составляющей).
Если я не ошибаюсь, List<> - это список, а не словарь, который содержит информацию типа "ключ-значение".
0
 Аватар для Bampo
114 / 82 / 37
Регистрация: 15.02.2020
Сообщений: 206
28.02.2020, 21:23
asdfg15432, обязательно пользоваться устаревшим WebRequest?
Это прошлый век. Уже давно надо пользоваться HttpClient, у него уже нормальная асинхронность из коробки через await/async и автоматическая сериализация через JSON.
https://docs.microsoft.com/ru-... net-client
1
2 / 2 / 0
Регистрация: 07.04.2015
Сообщений: 358
28.02.2020, 22:40  [ТС]
Спасибо за совет.
0
2 / 2 / 0
Регистрация: 07.04.2015
Сообщений: 358
29.02.2020, 11:47  [ТС]
Покажите, пожалуйста, пример отправки двух(или трех) параллельных, одновременных("+-") запросов(не важно на какой адрес). То есть, чтоб первый не ждал ответа с сервера, для того, чтоб второй запрос смог выполниться.
0
 Аватар для Bampo
114 / 82 / 37
Регистрация: 15.02.2020
Сообщений: 206
29.02.2020, 12:23
asdfg15432,

C#
1
2
3
4
5
6
var http = new HttpClient();
 
var task1 = http.PostAsJsonAsync("https://url.url", new {login="name", password="some password"} );
var task2 = http.PostAsJsonAsync("https://url.url", new {login="name2", password="some password"} );
 
await Task.WhenAll(task1, task2);
1
2 / 2 / 0
Регистрация: 07.04.2015
Сообщений: 358
29.02.2020, 13:04  [ТС]
Спасибо. Это то, что нужно. Но у меня появился еще один вопрос:
если у меня есть список List<string> адресов, на которые мне нужно отправить запросы параллельно, каким образом я могу сначала создать необходимое количество переменных task, чтоб потом их отправить все вместе?
0
 Аватар для Bampo
114 / 82 / 37
Регистрация: 15.02.2020
Сообщений: 206
29.02.2020, 13:15
asdfg15432,
C#
1
2
3
List<string> urls =...; //заполняется адресами лист 
var tasks = urls.Select(url => http.PostAsJsonAsync(url, someObject)); // асинхронно делаю кучу запросов и получаю IEnumerable<Task>
await Task.WhenAll(tasks); // жду окончания всех задач
1
2 / 2 / 0
Регистрация: 07.04.2015
Сообщений: 358
29.02.2020, 13:35  [ТС]
Спасибо! А можете показать, как перехватывать ответы от каждого из этих запросов. Дело в том, что у меня запрос типа GET. Я перестроил ваш код под свои нужды. И хотелось бы получить доступ к переменной, хранящей ответ по каждому запросу.
0
 Аватар для Bampo
114 / 82 / 37
Регистрация: 15.02.2020
Сообщений: 206
29.02.2020, 13:54
Лучший ответ Сообщение было отмечено asdfg15432 как решение

Решение

asdfg15432, в каждом элементе tasks есть Result, в нем лежит ответ
1
2 / 2 / 0
Регистрация: 07.04.2015
Сообщений: 358
29.02.2020, 14:35  [ТС]
Странно.... Прописываю tasks.re... и интелсенс не подсвечивает мне такой вариант как Result. Варианта Result нет в списке.

Добавлено через 10 минут
Все, нашел. Через foreach. Спасибо.

Добавлено через 6 минут
Но foreach тормозит выполнение кода до такой степени, как если бы запросы отправлялись синхронно.
Можно ли как-то получить Result не через foreach?
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
29.02.2020, 19:26
Цитата Сообщение от asdfg15432 Посмотреть сообщение
Но foreach тормозит выполнение кода до такой степени, как если бы запросы отправлялись синхронно.
Можно ли как-то получить Result не через foreach?
Код покажете?

Если написать так
C#
1
2
3
4
5
6
7
8
List<string> urls =...; //заполняется адресами лист 
var tasks = urls.Select(url => http.PostAsJsonAsync(url, someObject));
var results = new List<object>();
foreach(var task in tasks)
{
   var result = task.Result;
   results.Add(result);
}
То запросы действительно будут выполнятся по очереди.
0
2 / 2 / 0
Регистрация: 07.04.2015
Сообщений: 358
29.02.2020, 19:38  [ТС]
Спасибо за ваш вариант. Но я уже нашел решение. Запросы отправляются параллельно и, примерно, раз в 9 быстрее, чем синхронно.
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
29.02.2020, 19:44
asdfg15432, я не предлагал вариант. это пример неправильной реализации
0
2 / 2 / 0
Регистрация: 07.04.2015
Сообщений: 358
29.02.2020, 19:49  [ТС]
Ну, тогда спасибо за пример неправильной реализации))
0
 Аватар для imcavs™
-2 / 24 / 8
Регистрация: 19.02.2012
Сообщений: 446
29.02.2020, 20:29
Я не пойму. У вас апи! Вы его явно используете вместе с js.
В вашем апи явно есть методы IActionResult или IHttpActionResult.
Они по дефолту будут асинхронно выдавать множество ответов разным клиентам.
0
2 / 2 / 0
Регистрация: 07.04.2015
Сообщений: 358
29.02.2020, 20:40  [ТС]
JavaScript не использую. Дело в том, что в понятии "асинхронно" я, можно сказать, дилетант. Но вопрос, который мне необходимо было решить, закрыт. Всем спасибо, кто откликнулся.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.02.2020, 20:40
Помогаю со студенческими работами здесь

Http запрос в API
Делал вот такую прогу на C# using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; ...

VK api, запрос и кодировка
При использовании метода api вконтакте, который ищет на стене пользователя (wall.search) фразу или слово и возвращает количество постов с...

Get-запрос на api java
Добрый вечер! Помогите плиз с заданием, исходный код ниже 1) реализовать на dao GET-запрос на api &quot; https://reqres.in/api/users/4...

Запрос API в VB.Net
Подскажите пример, как отправить запрос, который ниже, с помощью VB.Net curl -X POST...

Поисковый запрос. API
Здравствуйте. Не давно появилась необходимость парсинга сайтов по определенному запросу. Перерыл весь google api, но ничего годного не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru