Sterlingz
Sterlingz

Reputation: 1

RestSharp Async Function Error with ExecuteAsync()

I have an IO bound method that hangs for a split second while fetching data. I've attempted to convert the method to an async method but am having issues with this.

I've included below the non-async version of the code, and my attempt at making it async.

    //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);
    }

There are two issues that I know of with the above code. The first line requires some some of Task keyword but I'm unsure how to code it. I've tried a number of things here without success.

Secondly, ExecuteAsync takes a 2nd argument but I'm unsure what. I've seen some examples of this, but they seem overly complicated for what I'm trying to do?

Appreciate any help you guys can offer!

Upvotes: 0

Views: 7260

Answers (3)

Sterlingz
Sterlingz

Reputation: 1

EDIT: The solution was to change the declaration to;

public async Task<double> GetBaselineAsync()

And change ExecuteAsync to ExecuteTaskAsync. Full code;

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);
}

Upvotes: 0

OlegI
OlegI

Reputation: 6010

If the library you use supports both sync and async methods(last usually with Async suffix) you should always use async ones. Async will create separate threads in your code in order to have better performance. And it will run concurrently when it needs. Async methods should almost in every case return Task or generic Task<>. If you want to call an asynchronous method in the synchronous method (in case of method signature doesn't allow you to use await keyword) you need to use .GetAwaiter().GetResult() upon a method which returns Task(in this case it will block the thread and won't run concurrently). Google around it worse it to spend time on it. Async await pattern was a huge step up of C# as language

Upvotes: 1

TheGeneral
TheGeneral

Reputation: 81513

If you want to use the Async Await pattern, you need to declare the method appropriately

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);
 }

Usage

await GetBaselineAsync();

Yes.. You will have to let your async propagate through your code like a virus, or not use it at all.

Secondly, if ExecuteAsync is taking 2 seconds, its not because of .Net, there is not reason why the compiler would make your code pause for 2 seconds because of an await (even if you aren't using it correctly) Its the the call to the internet

Upvotes: 1

Related Questions