最后使用HttpClient时不执行阻止

时间:2018-05-18 10:18:47

标签: c# xamarin.forms async-await try-catch-finally

我正在使用MVVM开发Xamarin.Forms应用程序。在我的viewmodel中,我希望从API中获取所有患者。这是代码:

public async Task GetAllPatients()
        {
            try
            {
                isFetchingData = true;
                var response = await httpClient.GetStringAsync(baseUrl + "/patient?query=ma");

                var resultPatients =
                    JsonConvert.DeserializeObject<ObservableRangeCollection<PatientViewModel>>
                    (testJson,jsonSerializerSettings);

                AllPatients.ReplaceRange(resultPatients);
                Patients.ReplaceRange(resultPatients);
            }
            catch(Exception e)
            {
                Console.WriteLine("*****ERROR kon API niet ophalen");
                Console.WriteLine(e.Message);
            }
            finally
            {
                CheckIfEmptyList();
                isFetchingData = false;
            }
        }

首先,我刚从代码中的json字符串(testJson)硬编码了API,一切顺利。但是从我把htppClient从评论中删除的那一刻起就发生了一些奇怪的事情(即使我没有使用你在代码中看到的变量(当我使用变量时我得到了相同的结果))。

不执行finally块。

也就是说,当我去调试应用程序时,代码遍历finally并检查列表是否为空并将isFetchingData置为false。但是我没有在屏幕上看到这种情况。如果列表为空,则应出现标签,但现在当列表不为空时,该标签不会消失。 INotifyPropertyChanged确实运行良好,因为没有httpClient它可以顺利运行。

我对异步编程很新,所以也许我忘了实现一些必须确保GetStringAsync正确结束的东西?也许它不断获取数据,这就是为什么我从来没有看到finally块被执行(即使它在屏幕后面)。我已经阅读了一些关于异步编程的文章,但找不到可以帮助我的东西。

我还必须说这个方法是从构造函数调用的,这使得运行异步更加困难。我尝试在没有异步等待的情况下调用它,我尝试这样调用它:

Task.Run(async ()=> { await GetAllPatients(); });

我尝试使用和不使用ConfigureAwait(false),但这也没有任何区别。

1 个答案:

答案 0 :(得分:0)

找到一种方法不将方法放在构造函数中(如CrowCoder和Albert所建议的)似乎是唯一的可能性。在这种情况下,我设法这样做,但对于其他人来说,它可能并不总是可能。

因为我在没有框架的情况下使用MVVM而且我对Xamarin和异步编程(我是学生)非常新,所以我很难找到构造函数的替代方法。

我将把它作为一个答案,但如果有人可以给出一个代码示例,它可以将方法放在构造函数中,或者解决方法,那么它仍然非常受欢迎。