Можно ли прекратить использование асинхронного и ждать, когда это необходимо - PullRequest
0 голосов
/ 02 мая 2018

Я реализую код от разработчика, который использует асинхронные функции.

Пример:

public async Task<string> GetDataAsync(string jsonString = "")
{
    string url = $"{this.url}";

    using (HttpClient httpClient = new HttpClient())
    {
        using (StringContent body = new StringContent(jsonString, Encoding.UTF8, "application/json"))
        {
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", this.accessToken);

            using (HttpResponseMessage response = await httpClient.PostAsync(url, body))
            {
                switch (response.IsSuccessStatusCode)
                {
                    case true:

                        return await response.Content.ReadAsStringAsync();

                    default:

                        throw new Exception($"Error calling url: {url}. HTTP status: {response.StatusCode}");

                }
            }
        }
    }
}

И мне не нужно и не хочу ничего асинхронно вызывать. Но проблема в том, что асинхронные функции все время перепрыгивают через мои функции, и поэтому я не могу просто перестать их использовать, и, поскольку у HttpClient нет функции Post() для использования вместо PostAnync(), я чувствую себя застрявшим в этой асинхронной клетке.

Есть ли хитрость или что-то еще для того, чтобы нормально вызывать асинхронную функцию, не позволяющую многопоточности пузыриться через все родительские функции?

Или единственное решение - найти пакет без асинхронных функций?

1 Ответ

0 голосов
/ 02 мая 2018

Короткий ответ - нет, нет общего способа сделать синхронную функцию из асинхронной задачи, основанной на задачах.

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

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

Код будет выглядеть так:

using (var response = Task.Run(() => httpClient.PostAsync(url, body).Result).Result)
{
    ...
}
...