RestSharp异步函数错误与ExecuteAsync()

时间:2019-01-12 16:33:37

标签: c# asynchronous restsharp

我有一个IO绑定方法,该方法在获取数据时会暂停一秒钟。我试图将方法转换为异步方法,但是与此有关。

我已在代码的非异步版本下添加了该代码,并尝试使其异步。

    //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 :(得分:0)

如果要使用 Async Await 模式,则需要适当地声明该方法

resume

用法

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花费2秒,这不是因为.Net,所以没有理由为什么编译器会由于ExecuteAsync而使您的代码暂停2秒(即使您没有正确使用它)是互联网的呼叫

答案 1 :(得分:0)

如果您使用的库同时支持同步和异步方法(最后一个通常带有异步后缀),则应始终使用异步方法。异步将在您的代码中创建单独的线程,以提高性能。并且它将在需要时同时运行。几乎在每种情况下,异步方法都应返回Task或泛型Task<>。如果要在同步方法中调用异步方法(如果方法签名不允许您使用await关键字),则需要在返回{{1}的方法上使用.GetAwaiter().GetResult() }(在这种情况下,它将阻塞线程,并且不会同时运行)。围绕它的谷歌恶化了它花费时间。 Task Async模式是C#语言的巨大进步

答案 2 :(得分:0)

编辑:解决方案是将声明更改为;

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