【问题标题】:Xamarin forms sqlite Async await not wait the processXamarin 表单 sqlite Async await 不等待进程
【发布时间】: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");

}

订单调试

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

【问题讨论】:

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

标签: c# sqlite asynchronous xamarin.forms


【解决方案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 按钮保存,我需要保存记录,并且只有在记录了所有注册和刷新屏幕之后。我发生这种情况是因为异步任务保存等待包含所有记录我刷新屏幕但仍然没有数据库中的记录
  • 好吧,如果你从你的方法定义中删除异步和任务并删除等待语句,你可以实现这一点,但是你的用户界面将在事务完成时被冻结。
猜你喜欢
  • 1970-01-01
  • 2021-12-11
  • 2016-03-08
  • 2020-07-10
  • 1970-01-01
  • 2020-08-01
  • 2020-08-03
  • 2021-01-26
  • 2019-04-14
相关资源
最近更新 更多