C# xamarin表单更新UI,使用wait/async

C# xamarin表单更新UI,使用wait/async,c#,xamarin,xamarin.ios,xamarin.forms,async-await,C#,Xamarin,Xamarin.ios,Xamarin.forms,Async Await,我正在用Visual Studio for Mac编写一个非常基本的Xamarin表单应用程序。 此应用程序应在Android和iOS上与PCL配合使用 我在XAML文件上有一个空的TableView。我想做的是用我将从Web服务获取的数据填充这个TableView 这是我的C#代码: HttpClient=newhttpclient(); 公共异步任务LoadData() { 尝试 { var response=await client.GetAsync(新Uri(“http://exampl

我正在用Visual Studio for Mac编写一个非常基本的Xamarin表单应用程序。 此应用程序应在Android和iOS上与PCL配合使用

我在XAML文件上有一个空的TableView。我想做的是用我将从Web服务获取的数据填充这个TableView

这是我的C#代码:

HttpClient=newhttpclient();
公共异步任务LoadData()
{
尝试
{
var response=await client.GetAsync(新Uri(“http://example.com/myservice.php"));
if(响应。IsSuccessStatusCode)
{
var content=await response.content.ReadAsStringAsync();
返回JsonConvert.DeserializeObject(内容);
}
}
捕获(例外)
{
返回null;
}
返回null;
}
已单击异步无效句柄(对象发送方,System.EventArgs e)
{
activity_indicator.IsRunning=true;
var data=等待加载数据();
activity_indicator.IsRunning=假;
mylistview.Root.Clear();
foreach(数据中的var项)
{
TableSection节=新的TableSection(){Title=item.GroupTitle};
foreach(item.subitems中的var子项)
{
var cell=new TextCell(){Text=subitem.Title};
单元格.Tapped+=在\u项上\u Tapped;
第.节添加(单元格);
}
mylistview.Root.Add(节);
}
}
我不熟悉等待和异步编程。我曾经使用iOS代理开发本机iOS应用程序。我听说线程不能更新UI:例如,我可以在LoadData()方法中进行一些UI更新吗? 所以我想知道我的代码是否好。 它看起来很好,因为它可以工作,但我想知道这样工作是否是件好事

private void UpdateUI(Action action)
{
     this.Invoke(new Action(action), null);
 }
用法:UpdateUI(()=>lable1.Text=“Updated”)

用法:UpdateUI(()=>lable1.Text=“Updated”)

我相信

Device.BeginInvokeOnMainThread(() =>
{

});
我相信是的

Device.BeginInvokeOnMainThread(() =>
{

});

使用
async/await
这里是正确的选择Wait将捕获当前上下文,并在异步调用完成时恢复该上下文,这使得在调用完成后更新UI变得很简单,如您所见。我的一个建议是将
Handle\u Clicked
中的代码分解到项目模板中,但这与
async
无关。当主线程等待等待指令时,您认为UI是被动的吗?@Bob5421运行代码并亲自查看。我只在模拟器中尝试过,似乎是这样reactive@Bob5421接下来就是了。使用
async/await
这里是正确的选择Wait将捕获当前上下文,并在异步调用完成时恢复该上下文,这使得在调用完成后更新UI变得很简单,如您所见。我的一个建议是将
Handle\u Clicked
中的代码分解到项目模板中,但这与
async
无关。当主线程等待等待指令时,您认为UI是被动的吗?@Bob5421运行代码并亲自查看。我只在模拟器中尝试过,似乎是这样reactive@Bob5421接下来就是了。这段代码在Xamarin表单中无效,也许你认为WinForms和IsInvokeRequired是必需的?你的意思是如果我在async方法中更新UI控件,我需要使用这个调用吗?@Bob5421不,你不需要。@JSteward如果这是WinForms应用程序,没有理由使用
InvokeRequired
,虽然这不是一个winforms应用程序,所以它是没有意义的。这段代码在Xamarin Forms中无效,也许你认为winforms和IsInvokeRequired是必需的?你的意思是如果我在async方法中更新UI控件,我需要使用这个调用吗?@Bob5421不,你不需要。@JSteward如果这是一个winforms应用程序,没有理由使用
invokererequired
,尽管这不是一个winforms应用程序,所以它是没有意义的。