Xamarin 表单 sqlite Async await 不等待进程

Posted

技术标签:

【中文标题】Xamarin 表单 sqlite Async await 不等待进程【英文标题】:Xamarin forms sqlite Async await not wait the process 【发布时间】:2017-02-20 11:48:24 【问题描述】:

因为它不尊重等待

public async Task Save(Ticket header, TicketLines newLines)

                Debug.WriteLine("init save");
                await dbConnection.RunInTransactionAsync(new Action<SQLite.Net.SQLiteConnection>(tran =>
                
                    dbConnection.InsertAsync(header).ContinueWith((t) =>
                    
                        Debug.WriteLine("-> New header ID: 0", header.Id);                       
                        foreach (var item in newLines)
                        
                            item.DocumentId = = header.Id;
                        
                        dbConnection.InsertAllAsync(newLines);                     
                    );
                    //tran.Commit();                    
                ));
                Debug.WriteLine("End Save");


订单调试

    初始化保存
      结束保存 sds ->新标头 ID:1

【问题讨论】:

可能是因为它不明白你想要做什么......意思是请编辑这个并提出一个真正的问题...... 您实际上并没有等待委托本身的任何内容。 【参考方案1】:

您有两个未等待的异步调用(您之前没有 await 关键字)

public Save(Ticket header, TicketLines newLines) 
            Debug.WriteLine("init save");
             dbConnection.RunInTransactionAsync(new Action<SQLite.Net.SQLiteConnection>(tran =>
            
                 dbConnection.Insert(header).ContinueWith((t) =>
                
                    Debug.WriteLine("-> New header ID: 0", header.Id);                       
                    foreach (var item in newLines)
                    
                        item.DocumentId = = header.Id;
                    
                     dbConnection.InsertAll(newLines);                     
                );
                //tran.Commit();                    
            ));
            Debug.WriteLine("End Save");

【讨论】:

我刚刚复制了他的部分代码并添加了等待,但如果您愿意,我可以添加其余部分以使答案更容易理解。 我无法执行事务,如果发生错误则中止所有插入 好的,阅读你的问题我看到你已经写了调试输出的日志。 init save -> End save sds -> New header ID: 1. 那就是 await 所做的,它让函数运行并继续当前执行,你要做什么?线性运行? 我会解释的。我有 UI 按钮保存,我需要保存记录,并且只有在记录了所有注册和刷新屏幕之后。我发生这种情况是因为异步任务保存等待包含所有记录我刷新屏幕但仍然没有数据库中的记录 好吧,如果你从你的方法定义中删除异步和任务并删除等待语句,你可以实现这一点,但是你的用户界面将在事务完成时被冻结。

以上是关于Xamarin 表单 sqlite Async await 不等待进程的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin SQLite教程Xamarin.iOS项目添加引用

Xamarin 服务和表单初始化

使用Sqlite数据库在Xamarin跨平台完成登录代码

使用 mvvm 在 xamarin 表单中的视图之间传递数据

使用mvvm在xamarin表单中的视图之间传递数据

Onclicking listview 单元格仅更改单击的单元格 xamarin 表单的内容