所以......一个月前我开始在Visual Studio上开发通用Windows平台,我制作了一个小应用程序,以跟上比特币,以太坊和Litecoin的价格(每个都有它的图表和所有东西)。
我的问题出现在我称为“GetHisto”的函数中,该函数获取最后一小时/每天/每周/每月/每年的历史值,并且它始终按预期工作,通过单击其中一个来更改此时间范围5个按钮,除非我从月/年跳到最后一小时,当应用程序永远保持加载时。
这是我的GetHisto代码:
async internal static Task GetHisto(string crypto, string time, int limit) {
String URL = "https://min-api.cryptocompare.com/data/histo" + time + "?e=CCCAGG&fsym="
+ crypto + "&tsym=" + coin + "&limit=" + limit;
if (limit == 0)
URL = "https://min-api.cryptocompare.com/data/histoday?e=CCCAGG&fsym=" + crypto + "&tsym=" + coin + "&allData=true";
Uri requestUri = new Uri(URL);
HttpClient httpClient = new HttpClient();
string response = "";
try {
//Send the GET request
response = await httpClient.GetStringAsync(requestUri);
var data = JToken.Parse(response);
//var jsonStatham = await GetJSONAsync(requestUri);
//JToken data = jsonStatham.Result;
//simplified the code as this part was not important
关于代码的两行注释来自我在http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html上看到的方法,但是使用该方法,应用程序永远不会崩溃,UI在获取数据时变得没有响应,这是一个很大的缺点。 (特别是因为我最近添加了一个小的加载动画,它显示了这段代码,但没有使用评论行中的方法。
有什么方法我不知道使用这两条注释行,同时仍然让UI保持响应?
编辑:尝试对catch子句进行等待,但看起来仍然没有触发。当我正在调试时,应用程序将会卡住,它会进入第一行:httpResponse = await httpClient.GetAsync(uri);
并且它永远停留在该行,而不会转到下一行检查状态代码:
httpResponse.EnsureSuccessStatusCode();
编辑2:哦,我想我知道什么是错的!并且它不是这个代码的任何东西,因为我创建了一个新项目,我自动按顺序发出相同的请求,一切都很顺利。所以我“退后一步”,并认为如果问题是我从一个月/一年改为一小时,而不是从一天到一小时,那可能是因为它们的时间跨度太大了,并且用TelerikUI库我用于图表,看起来问题确实是我如何处理图表的更新过程。这就是我现在处理它的方式:
case "hour":
BTC_DateTimeAxis.LabelFormat = "{0:HH:mm}";
BTC_DateTimeAxis.MajorStepUnit = Telerik.Charting.TimeInterval.Minute;
BTC_DateTimeAxis.MajorStep = 10;
BTC_DateTimeAxis.Minimum = DateTime.Now.AddHours(-1);
timeSpan = "hour";
limit = 60;
break;
case "day":
BTC_DateTimeAxis.LabelFormat = "{0:HH:mm}";
BTC_DateTimeAxis.MajorStepUnit = Telerik.Charting.TimeInterval.Hour;
BTC_DateTimeAxis.Minimum = DateTime.Now.AddDays(-1);
BTC_DateTimeAxis.MajorStep = 6;
timeSpan = "day";
limit = 1500;
break;
.....
所以,每当我有周/月/年模式的图表,并且我直接跳到小时,似乎更改轴的MajorStepUnit和MajorStep值会破坏图表和整个应用程序。 (我猜调试器无限期地停留在httpClient.GetAsync(uri);只是因为各种线程正在工作,但不是因为该行是导致错误的那一行。)