c# - 使用 HttpClient 时未执行 finally 块
问题描述
我正在使用 MVVM 开发 Xamarin.Forms 应用程序。在我的视图模型中,我想从 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;
}
}
起初,我只是从testJson
我的代码中的 json 字符串 () 硬编码 API,一切顺利。但是从我将 htppClient 排除在评论之外的那一刻起,发生了一些奇怪的事情(即使我不使用你在代码中看到的变量(尽管我使用变量时我得到了相同的结果))。
finally 块没有被执行。
也就是说,当我去调试应用程序时,代码会经过finally并检查列表是否为空并将isFetchingData设置为false。但我没有在屏幕上看到这种情况。如果列表为空,则应该出现一个标签,但现在当列表不为空时该标签不会消失。INotifyPropertyChanged 运行良好,因为没有 httpClient 它运行顺利。
我对异步编程很陌生,所以也许我忘了实现一些必须确保 GetStringAsync 正确结束的东西?也许它一直在获取数据,这就是为什么我从来没有看到 finally 块执行(即使它在屏幕后面执行)。我读过一些关于异步编程的文章,但找不到可以帮助我的东西。
我还必须说,这个方法是从构造函数中调用的,这使得异步运行有点困难。我尝试在没有异步等待的情况下调用它,并尝试这样调用它:
Task.Run(async ()=> { await GetAllPatients(); });
我试过有无,ConfigureAwait(false)
但这也没有什么区别。
解决方案
找到一种不将方法放入构造函数的方法(如 CrowCoder 和 Albert 所建议的)似乎是唯一的可能性。在这种情况下,我设法做到了,但对于其他人来说,这可能并不总是可能的。
因为我在没有框架的情况下使用 MVVM,而且我对 Xamarin 和异步编程非常陌生(我是一名学生),所以我很难找到构造函数的替代方案。
我会把它作为一个答案,但如果有人可以给出一个代码示例,可以将方法放入构造函数中,或者解决方法,它仍然非常受欢迎。
推荐阅读
- c# - Websockets:从NodeJS websocket服务器到带有WebSocketSharp的C#客户端的多个响应
- javascript - 我想通过使用来自 Firestore 的地图来显示我的标签“等素食主义者、意大利面……等等”?
- acumatica - Acumatica - 数据视图 LSAMProdItem_lotseropts
- firebase - 从 Firebase 读取 UserData 的问题
- python - 从系统路径anaconda git repo的子目录导入python文件
- arrays - 添加具有多个真实 filterxml 变量的 ifs 函数
- sql - 导出 csv 返回十六进制结果
- amazon-web-services - 新的 Route53 记录需要很长时间才能传播
- css - 需要帮忙!试图在图像下方放置导航链接
- css - 打破li元素含量