c# - SQLite 异步任务和 Wait 运算符 - 任务会以正确的顺序执行吗?

标签 c# xamarin async-await task sqlite-net

我有一个包含多个表的 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);
}

引用 Async/Await - Best Practices in Asynchronous Programming

关于c# - SQLite 异步任务和 Wait 运算符 - 任务会以正确的顺序执行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51224944/

相关文章:

c# - SpecFlow 功能可以在步骤之间共享吗?

c# - 如何将带有反斜杠的字符串与另一个字符串连接起来

c# - 如何在 Windows 8 中使用 StreamWriter 写入文件?

android - 有人可以解释一下我们在 Xamarin(android 的 mono)中编译 android 代码时生成的文件吗?

javascript - 使用 setTimeout 暂停 REST API 调用

c# - 如何从 Visual Studio 2010 恢复已删除的项目?

c# - Xamarin Android C# 计时器错误

msbuild - 如何使用 MSBuild 构建 Xamarin iOS 应用程序?

Javascript - 处理异步竞争条件

具有动态延迟的 C# 任务