出于某种原因,我的异步方法在特定情况下不起作用

时间:2017-09-13 21:58:42

标签: c#

所以......一个月前我开始在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);只是因为各种线程正在工作,但不是因为该行是导致错误的那一行。)

0 个答案:

没有答案