Перейти к публикации
SetAres

Ассинхронное обращение к серверу C#

Рекомендованные сообщения

Всем привет! Объясните почему в качестве примера использования API на бирже bittrex встречаются реализации с асинхронным выполнением? Например:

public static async Task<BalanceModel> GetAccountBalanceAsync(string currency)        {
            string responseStr = await HttpUtilities.GetHttpResponseAsync("https://bittrex.com/api/v1.1/account/getbalance?currency={currency}", true);
            var result = JsonConvert.DeserializeObject<JsonResultWrapper>(responseStr);
            if (!result.Success)
            {
                throw new Exception("Failed to retrieve account balance. Message: {result.Message}");
            }
            return result.Result.ToObject<BalanceModel>();
        }
 
Я для написания робота использовал синхронные методы, к примеру:
            public void GetBalances()
            {
                    var nonce = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds;


                    var uri = string.Format("https://bittrex.com/api/v1.1/account/getbalances?APIKEY={0}&nonce={1}", APIKEY, nonce);
                    var hmac = new HMACSHA512(Encoding.UTF8.GetBytes(SECRETS));
                    var sign = BitConverter.ToString(hmac.ComputeHash(Encoding.UTF8.GetBytes(uri))).ToLower().Replace("-", "");


                    using (var http = new HttpClient())
                    {
                        try
                        {
                            http.DefaultRequestHeaders.Add("apisign", sign);
                            execResultGetBalances = http.GetStringAsync(uri).Result;
                        }
                        catch (Exception)
                        {
...

В  чем преимущества первого метода, используя ключевые слова async и await? Во втором случае как по мне всё удобно, т.к. выполняется всё ПОСЛЕДОВАТЕЛЬНО - отправил запрос > получил ответ > провел манипуляции с данными. В асинхронном случае же (если я правильно понимаю) есть вероятность не дождаться ответа, как прога будет уже работать с данными, которые на самом деле ещё не пришли, т.е. отправил запрос > если ответ долго идет > провел манипуляции с данными (которые не пришли) и тут вдруг приходит ответ от сервера с данными.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Проблема лежит в другой плоскости. Для начала нужно понимать различие между ассинхронностью и многопоточностью. Ассинхронность - это выполнение нескольких тасков в одном(!) потоке. У IIS есть макс. количество потоков(то-ли 50 потоков на одно ядро процессора, не суть, главное что их не бесконечное количество) в которых соответственно могут выполняться таски. Так вот - в высоконагруженных приложениях может случиться так что вы забьете синхронными задачами весь пул потоков, и IIS просто перестанет принимать новые задачи. Чтобы этого не случилось и придумали ассинхронность. То о чем боитесь вы - это проблемы многопоточных задач, но не ассинхронных.

 

Т.к. у вас на сервере крутится один робот то врят-ли вы в этот лимит упретесь...нужно ли учиться писать более универсальный код? Думаю да)

Изменено пользователем Vasyaaa

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@SetAres, Если еще актуально: ты не прав насчет того что данные не придут. За это отвечает Await. В этом фишка, придуманная Мелкософтом. У тебя асинхронный метод, но если ты перед вызовом скажешь await, то поток выполняющий асинхронную опперацию будет дожидаться выполнения этого метода. .net компилятор сам обернет вызовы этих методов в соответствующие конструкции. 

 

Но есть огромный плюс, в момент когда приложение будет ждать окончания ассинхронной операции, ресурсы процессора освободятся и могут быть использованы для других оппераций. А в твоем примере поток будет усыплен пока данные не придут. 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.

×