Ошибка асинхронной функции RestSharp с ExecuteAsync () - PullRequest
0 голосов
/ 12 января 2019

У меня есть метод ввода-вывода, который зависает на долю секунды при получении данных. Я пытался преобразовать метод в асинхронный метод, но у меня возникли проблемы с этим.

Я включил ниже не асинхронную версию кода и мою попытку сделать его асинхронным.

    //non async method
    public double GetBaseline()
    {
        var Client = new RestClient();
        IRestResponse response;
        Client.BaseUrl = new Uri("https://apiv2.bitcoinaverage.com/indices/global/ticker/short?crypto=BTC&fiat=USD");
        CryptoAverage BTCAvg;
        var request = new RestRequest();
        response = Client.Execute(request);
        BTCAvg = JsonConvert.DeserializeObject<CryptoAverage>(response.Content);
        return Math.Round(BTCAvg.BTCUSD.Last, 2);
    }

    //async method
    public async double GetBaselineAsync()
    {
        var Client = new RestClient();
        IRestResponse response;
        Client.BaseUrl = new Uri("https://apiv2.bitcoinaverage.com/indices/global/ticker/short?crypto=BTC&fiat=USD");
        CryptoAverage BTCAvg;
        var request = new RestRequest();
        response = await Client.ExecuteAsync(request);
        BTCAvg = JsonConvert.DeserializeObject<CryptoAverage>(response.Content);
        return Math.Round(BTCAvg.BTCUSD.Last, 2);
    }

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

Во-вторых, ExecuteAsync принимает второй аргумент, но я не уверен, что. Я видел несколько примеров этого, но они кажутся слишком сложными для того, что я пытаюсь сделать?

Ценю любую помощь, которую вы, ребята, можете предложить!

Ответы [ 3 ]

0 голосов
/ 12 января 2019

Если используемая вами библиотека поддерживает как синхронные, так и асинхронные методы (обычно последние с суффиксом Async), вы всегда должны использовать асинхронные. Async создаст отдельные потоки в вашем коде для повышения производительности. И он будет работать одновременно , когда ему нужно . Асинхронные методы должны почти в каждом случае возвращать Task или универсальный Task<>. Если вы хотите вызвать асинхронный метод в синхронном методе (в случае, если сигнатура метода не позволяет использовать ключевое слово await), вам нужно использовать .GetAwaiter().GetResult() для метода, который возвращает Task (в данном случае это заблокирует поток и не будет работать одновременно). Гугл вокруг него хуже, чтобы на него тратить время. Async await шаблон был огромным шагом по сравнению с C # как языком

0 голосов
/ 12 января 2019

РЕДАКТИРОВАТЬ: решение было изменить объявление на;

public async Task<double> GetBaselineAsync()

И измените ExecuteAsync на ExecuteTaskAsync. Полный код;

public async Task<double> GetBaselineAsync()
{
    var Client = new RestClient();
    IRestResponse response;
    Client.BaseUrl = new Uri("https://apiv2.bitcoinaverage.com/indices/global/ticker/short?crypto=BTC&fiat=USD");
    CryptoAverage BTCAvg;
    var request = new RestRequest();
    response = await Client.ExecuteTaskAsync(request);
    BTCAvg = JsonConvert.DeserializeObject<CryptoAverage>(response.Content);
    return Math.Round(BTCAvg.BTCUSD.Last, 2);
}
0 голосов
/ 12 января 2019

Если вы хотите использовать шаблон Async Await , вам необходимо соответствующим образом объявить метод

public async Task<double> GetBaselineAsync()
{
    var Client = new RestClient();
    IRestResponse response;
    Client.BaseUrl = new Uri("https://apiv2.bitcoinaverage.com/indices/global/ticker/short?crypto=BTC&fiat=USD");
    CryptoAverage BTCAvg;
    var request = new RestRequest();
    response = await Client.ExecuteAsync(request);
    BTCAvg = JsonConvert.DeserializeObject<CryptoAverage>(response.Content);
    return Math.Round(BTCAvg.BTCUSD.Last, 2);
 }

Использование

await GetBaselineAsync();

Да. Вам придется разрешить вашему async распространяться по вашему коду, как вирусу, или вообще не использовать его.

Во-вторых, если ExecuteAsync занимает 2 секунды, это не из-за .Net, нет причины, по которой компилятор заставил бы ваш код сделать паузу на 2 секунды из-за await (даже если вы не используете это правильно) Это звонок в интернет

...