Вызов API-синхронизации или асинхронного? - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь использовать API, который я разработал в NODE.js, я делаю это из настольного приложения c # windows form.

API написано ASYNC на стороне сервера, но может ли оно быть синхронизировано внутри моего клиента? Позвольте мне объяснить, что я имею в виду.

Это пример кода того, что я делаю:

public static DateTime GetDateTime()
{
    try
   {
        string result = Task.Run(() => 
        client.GetStringAsync(client.BaseAddress)).Result;
        Date currentTime = JsonConvert.DeserializeObject<Date>(result);
        return currentTime.Value;
    }
   catch (Exception ex)
   {
       throw ex;
   }

}  

Позже в программе я вызываю эту функцию:

DateTime currentDate = GymAPI.GetDateTime();

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

Как я понимаю, если я использую ASYNC / AWAIT, код, который вычисляет возраст людей, будет выполнен сразу же, в то время как, скорее всего, у меня еще не будет значения текущей даты. Я прав в этом предположении?

Нужно ли запускать что-либо ASYNC в моем приложении, кроме случаев, когда я отправляю электронное письмо (занимает около 5 секунд), и я хочу, чтобы задача sendmail выполнялась в фоновом режиме, пока приложение остается отзывчивым для пользователя?

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

Если вопросов слишком много, ответьте только на последний! :)

1 Ответ

0 голосов
/ 15 апреля 2019

Так что я был в замешательстве и не понимал отношения ASYNC / AWAIT / TASK ... Но теперь я думаю, что это намного яснее.

Я последовал совету и пошел по пути ASYNC, следуя примерувнутри этой ссылки: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/

Я переписал все, как это, на случай, если кому-то все равно:

        public static async Task<DateTime>GetDateTime()
        {
            using (HttpClient client = new HttpClient())
            {
                // Omitted some code here for simplicity.
                try
                {
                    string result = await client.GetStringAsync(client.BaseAddress);
                    Date currentTime = JsonConvert.DeserializeObject<Date>(result);
                    return currentTime.Value;
                }
                catch (Exception ex)
                {
                    throw ex;
                }

            }
        }

В основном вы можете запускать Tasks ASYNC, поэтому при вызове функции GetDateTime () вы запуститезапустить задачу, не блокируя приведенный ниже код от выполнения следующим образом:

Task<DateTime> getCurrentDate = MyClass.GetDateTime();
//Code here executes right away without waiting for the task to finish

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

DateTime result = await getCurrentDate;

Или вы можете начать и ждать завершения задачи в той же строке кода:

DateTime result = await MyClass.getCurrentDate();

С помощью описанного выше метода это выглядит синхронно, но вы не пользуетесь преимуществамивыполнение одной или нескольких задач во время выполнения другого кода.

...