Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在数据库操作正在进行时更新XAML,然后在数据库操作完成后再次更新它';结束了吗?_C#_Xamarin_Xamarin.forms - Fatal编程技术网

C# 如何在数据库操作正在进行时更新XAML,然后在数据库操作完成后再次更新它';结束了吗?

C# 如何在数据库操作正在进行时更新XAML,然后在数据库操作完成后再次更新它';结束了吗?,c#,xamarin,xamarin.forms,C#,Xamarin,Xamarin.forms,我的意图是,当按下按钮时,屏幕上将立即显示一个活动指示器,然后将进行数据库查询。查询完成后,将创建一个XAML网格,删除活动指示符并添加新的XAML网格。在实践中,这是所有的工作,但往往活动指标不显示,所以我想知道我是否有我的方式编码错误 我有一个按钮,可以触发UpdateDetails方法: private async Task UpdateDetails() { details.Children.Clear(); details.Childre

我的意图是,当按下按钮时,屏幕上将立即显示一个活动指示器,然后将进行数据库查询。查询完成后,将创建一个XAML网格,删除活动指示符并添加新的XAML网格。在实践中,这是所有的工作,但往往活动指标不显示,所以我想知道我是否有我的方式编码错误

我有一个按钮,可以触发UpdateDetails方法:

    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同意,但由于我们不知道这样添加更好,以便更好地理解提问者!!