【发布时间】:2018-12-15 22:07:02
【问题描述】:
我有一个包含多个表的 SQLiteAsyncConnection 数据库,我想在插入其中一个表后取回主键。我的插入在数据库模型中看起来像这样
public Task SaveZoneAsync(Zone zone)
{
if (zone.ID == 0)
{
return database.InsertAsync(zone);
}
else
{
return database.UpdateAsync(zone);
}
}
在数据库模型中,我也有这种方法可以从给定的表中获取最后插入的 id。
public async Task<int> GetLastInsertAsync(String tablename)
{
int x = await database.ExecuteScalarAsync<int>("SELECT last_insert_rowid() FROM " + tablename);
return x;
}
在我的 ViewModel 中,我有这个方法并计划将一个 Zone 对象传递给它以插入到数据库中
public static int AddZoneToDB(Zone zone)
{
Task AddZone = Task.Factory.StartNew(() => App.Database.SaveZoneAsync(zone));
AddZone.Wait();
Task<int> getID = App.Database.GetLastInsertAsync("Zone");
getID.RunSynchronously();
int zoneID = getID.Result;
return zoneID;
}
并像这样执行它
int zoneID = MapPageViewModel.AddZoneToDB(zoneToAdd);
我的问题是AddZoneToDB 方法中的AddZone.Wait() 是否会确保addZone 任务在从getID.Result 获取int 之前完成运行?基本上试图确保我总是从正确的记录中获得正确的 ID。我只是不确定Wait() 和RunSynchronously() 如何一起工作。这是 Xamarin.Forms 中的 Xamarin SQLite db。 ID 设置为主键并在 Zone 模型中自动递增。
【问题讨论】:
-
试试看吧。也可以尝试使用 async/await,因为它更容易
-
我一直无法理解如何很好地使用 async/await。你可以看到我在代码中使用了一点,但我厌倦了必须做这么多工作来弄清楚如何使方法异步等才能使用 await。如果您有任何关于如何使用 await/async 的非常好的教程,您可以指出我将不胜感激。我在网上找到的文档似乎让我更加困惑。
-
我建议使用 async/await consistently 或者将连接类型更改为 SQLiteConnection 并使用同步代码并将其包装在线程中(通过 task.run 或手动创建的线程实例)
标签: c# xamarin async-await task sqlite-net