我有一个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接受第二个参数,但是我不确定。我已经看到了一些示例,但是对于我想做的事情,它们似乎过于复杂了?
感谢你们提供的任何帮助!
答案 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);
}