我有一个包含多个表的 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
的整数?基本上是想确保我总是从正确的记录中获得正确的 ID。我只是不确定 Wait()
和 RunSynchronously()
如何协同工作。这是 Xamarin.Forms 中的 Xamarin SQLite 数据库。 ID在Zone模型中设置为主键并自动递增。
最佳答案
避免使用 Task.Factory.StartNew
而是使用 Task.Run
。但是,由于目标成员已经返回一个 Task
,因此实际上也不需要 Task.Run
尝试让代码一直异步,而不是尝试混合异步和阻塞代码。
public static async Task<int> AddZoneToDbAsync(Zone zone) {
await App.Database.SaveZoneAsync(zone);
int zoneID = await App.Database.GetLastInsertAsync("Zone");
return zoneID;
}
GetLastInsertAsync
未对局部变量执行任何操作,应重构为仅返回任务。
public Task<int> GetLastInsertAsync(String tablename) {
return database.ExecuteScalarAsync<int>("SELECT last_insert_rowid() FROM " + tablename);
}
关于c# - SQLite 异步任务和 Wait 运算符 - 任务会以正确的顺序执行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51224944/