gpt4 book ai didi

c# - 在初始化期间调用异步方法时 MvvmCross UI 卡住

转载 作者:太空宇宙 更新时间:2023-11-03 13:24:47 25 4
gpt4 key购买 nike

当我尝试在 ViewModel 初始化期间加载 API 端点的内容时,我在 Xamarin.Android/iOS 上遇到 MvvmCross 问题。我正在从一个 API 加载一个区域的当前天气预报,我用异步方法编写它,它是从初始化生命周期回调中调用的。到目前为止,我已经尝试过 Stat() 和 Init()。在这两种情况下,我的 UI 都加载了我的 ViewModel 中的值,但随后立即卡住。如果我在异步代码中的任何位置设置断点,断点会捕获并播放,它会按预期工作。我怀疑某处存在某种竞争条件,但我不确定如何避免它并在我的 ViewModel/View 出现时加载数据。这是我的代码:

//天气服务

public async Task<WeatherStatus> GetWeatherStatus (string zip)
{
var client = new HttpClient();
var msg = await client.GetAsync(string.Format(WeatherApiUrlBase, WeatherApiKey, zip));
if (msg.IsSuccessStatusCode)
{
using (var stream = await msg.Content.ReadAsStreamAsync())
{
using (var streamReader = new StreamReader(stream))
{
var str = await streamReader.ReadToEndAsync();
var obj = JsonConvert.DeserializeObject<WeatherStatus>(str);
return obj;
}
}
}
return null;
}

//第一 View 模型

public async override void Start ()
{
base.Start ();
FetchWeatherStatus ();
}

private async void FetchWeatherStatus() {
var weatherData = await _service.GetWeatherStatus ("84043");
FeelsLike = weatherData.current_observation.feelslike_f;
}

这个异步代码可以通过按 MvxCommand 按钮正常工作;但是如果从构造函数、Init 或 Start 调用,如果我在其中某处没有断点,它每次都会卡住 UI。如果有人可以帮助我找到我做错了什么,我将不胜感激。谢谢。

编辑

我发现当我不调试时,该应用似乎运行正常。我从 Xamarin Studio 停止调试器并重新启动应用程序,它运行完美。

这里要求的是我用于绑定(bind) FeelsLike 的 XML:

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
local:MvxBind="Text FeelsLike" />

我也试过添加 .ConfigureAwait(false);对于我所有的等待电话,情况似乎更糟。 UI 永远不会被初始化,它位于黑屏上,而不是我的常规 UI 卡住。

这可能会有帮助,但这里是我的项目文件夹的链接(它非常小,因为我刚刚学习这个框架): http://goo.gl/SJscZA

编辑 2

问题可能出在我的 HttpClient 代码中?我用一个简单的 Task.Delay(5000) 替换它并返回一个空的 WeatherStatus 以查看发生了什么并且它没有卡住。我将研究以另一种方式获取数据。我是 Xamarin 的新手,所以我愿意接受这里的建议。谢谢。这是我的 Task.Delay() 代码 fragment :

public async Task<WeatherStatus> GetWeatherStatus (string zip)
{
await Task.Delay (5000);
return new WeatherStatus ();
}

最佳答案

通常,这意味着您需要将 .ConfigureAwait(false) 添加到每个 await 中,以防止同步上下文中出现死锁:

    public async Task<WeatherStatus> GetWeatherStatus (string zip)
{
var client = new HttpClient();
var msg = await client.GetAsync(string.Format(WeatherApiUrlBase, WeatherApiKey, zip)).ConfigureAwait(false);
if (msg.IsSuccessStatusCode)
{
using (var stream = await msg.Content.ReadAsStreamAsync().ConfigureAwait(false))
{
using (var streamReader = new StreamReader(stream))
{
var str = await streamReader.ReadToEndAsync().ConfigureAwait(false);
var obj = JsonConvert.DeserializeObject<WeatherStatus>(str);
return obj;
}
}
}
return null;
}

关于c# - 在初始化期间调用异步方法时 MvvmCross UI 卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22119268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com