C# 如何在数据库操作正在进行时更新XAML,然后在数据库操作完成后再次更新它';结束了吗?
我的意图是,当按下按钮时,屏幕上将立即显示一个活动指示器,然后将进行数据库查询。查询完成后,将创建一个XAML网格,删除活动指示符并添加新的XAML网格。在实践中,这是所有的工作,但往往活动指标不显示,所以我想知道我是否有我的方式编码错误 我有一个按钮,可以触发UpdateDetails方法:C# 如何在数据库操作正在进行时更新XAML,然后在数据库操作完成后再次更新它';结束了吗?,c#,xamarin,xamarin.forms,C#,Xamarin,Xamarin.forms,我的意图是,当按下按钮时,屏幕上将立即显示一个活动指示器,然后将进行数据库查询。查询完成后,将创建一个XAML网格,删除活动指示符并添加新的XAML网格。在实践中,这是所有的工作,但往往活动指标不显示,所以我想知道我是否有我的方式编码错误 我有一个按钮,可以触发UpdateDetails方法: private async Task UpdateDetails() { details.Children.Clear(); details.Childre
private async Task UpdateDetails()
{
details.Children.Clear();
details.Children.Add(Helpers.Activity.Create());
var newGrid = doLongRunningDatabaseTaskandCreateXAML();
details.Children.Clear();
details.Children.Add(Helpers.Activity.Create(newGrid);
}
有人能告诉我如何先显示活动指示器,直到数据库操作完成,然后再显示新网格吗?请注意,最重要的是在数据库操作和创建newGrid的过程中显示活动指示器
如果可能的话,请在你的答案中加入上面的代码,以便尽可能清楚。谢谢很简单:
- 使您的方法同步
- 在异步
任务的UI线程中添加不需要的代码。运行
Task.Run(async () => { //Your piece of code }
- 现在,当您想要更新UI时,只需使用以下命令在
中编写该部分代码MainThread
Device.BeginInvokeOnMainThread(() => { //UI updation });
private async Task UpdateDetails()
{
Task.Run(async () =>
{
Device.BeginInvokeOnMainThread(() => { details.Children.Clear();
details.Children.Add(Helpers.Activity.Create());});
var newGrid = await doLongRunningDatabaseTaskandCreateXAML();
Device.BeginInvokeOnMainThread(() => { details.Children.Clear();
details.Children.Add(Helpers.Activity.Create(newGrid);});
}
}
注意如果
doLongRunningDatabaseTaskandCreateXAML
属于async task
类型,那么您根本不需要使用task.Run
方法。async
和Wait
,您没有在等待长时间运行的代码如果我等待该代码,那么第二行还会更新UI吗?你能给我举个例子说明我是如何做到这一点的吗。请注意,doLongRunningDatabaseTaskandCreateXAML();它不是异步的。我必须改变这一点吗?我不认为删除你的问题并再次提问有什么帮助。你刚刚失去了所有已经取得的进展,以及投入努力的人的评论。@GeraldVersluis你能把(删除的)问题联系起来吗?我相信只有一条评论,我不完全理解解释的内容。所以我试着用这个问题回到基础上来,更清楚地解释我的问题。你能把我问题中的代码添加到你的答案中,让它变得更清楚吗。我以前有一个类似问题的答案,但有点不清楚,我认为最清楚的应该是使用原始代码,因为它在答案中不是很大。谢谢我已经根据我对您代码的理解更新了答案,请查看@ALAN2您可以省略任务。请同时运行呼叫。假设doLongRunning…()
类型为Task
,则wait
应自动将其放置在非UI任务中。@Tom同意,但由于我们不知道这样添加更好,以便更好地理解提问者!!