最后,使用 HttpClient 时未执行块



我正在使用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;
}
}

起初,我只是从代码中的json字符串(testJson)硬编码了API,一切都很顺利。但是从我将htppClient从注释中删除的那一刻起,发生了一些奇怪的事情(即使我不使用您在代码中看到的变量(当我使用变量时,我得到了相同的结果))。

最终块不执行。

也就是说,当我去调试应用程序时,代码会通过 finally 并检查列表是否为空并将 isFetchingData 设置为 false。但我在屏幕上没有看到这种情况发生。如果列表为空,则应该会出现标签,但现在当列表不为空时,标签不会消失。INotifyPropertyChanged 确实工作得很好,因为没有 httpClient,它运行流畅。

我对异步编程很陌生,所以也许我忘了实现一些必须确保 GetStringAsync 正确结束的东西?也许它会继续获取数据,这就是为什么我从未看到最终块被执行(即使它在屏幕后面)。我读过一些关于异步编程的文章,但找不到可以帮助我的东西。

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

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

我尝试过有和没有ConfigureAwait(false)但这也没有区别。

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

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

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

相关内容

  • 没有找到相关文章

最新更新