异步表创建和查询优缺点

时间:2017-07-16 05:22:07

标签: xamarin xamarin.forms

在我的申请表中,我有以下内容:

db2.CreateTable<CategoryGroup>();
db2.CreateTable<Category>();
db2.CreateTable<CategoryGroupSource>();
db2.CreateTable<CategorySource>();
db2.CreateTable<Phrase>();
db2.CreateTable<PhraseSource>();
db2.CreateTable<Score>();
db2.CreateTable<Setting>();

根据我的理解,还有一种Async方法可以做到这一点:

database.CreateTableAsync<TodoItem>().Wait();

有人可以解释我使用Async方式是否有任何优势,人们通常总是使用Async吗?

如果我使用这种类型的异步查询,也可能会有好处:

    public Task<TodoItem> GetItemAsync(int id)
    {
        return database.Table<TodoItem>().Where(i => i.ID == id).FirstOrDefaultAsync();
    }

1 个答案:

答案 0 :(得分:1)

在主(UI)线程上调用方法时,只要执行该方法,UI上的所有内容都会停止。如果db2.CreateTable<CategoryGroup>()在做这件事情时没有花费太多时间,那么这不应该是一个问题。

在彼此之后直接执行大量时间操作可能会影响您的UI并使其冻结。

调用方法的*Async变体通过任务API将工作移动到后台线程。但是,对该任务调用Wait()会使当前线程(在本例中为UI线程)等待任务完成,并且您仍然遇到同样的问题。

您应始终await个任务:await database.CreateTableAsync<TodoItem>()。这将让它在后台线程上执行,而不是让当前线程等待它完成。代码中的下一行不会执行,直到任务完成为止。当您编写代码时,它使` Async 变体看起来像它的行为与常规版本相同。

就个人而言,我可能会将所有方法都移到任务中,等待它。这样你就不会在每个任务之间返回UI线程来执行下一个任务:

await Task.Run(() =>
{
    db2.CreateTable<CategoryGroup>();
    db2.CreateTable<Category>();
    db2.CreateTable<CategoryGroupSource>();
    db2.CreateTable<CategorySource>();
    db2.CreateTable<Phrase>();
    db2.CreateTable<PhraseSource>();
    db2.CreateTable<Score>();
    db2.CreateTable<Setting>();
}

在这种情况下,您要让数据库在后台线程上完成所有工作(而不是冻结用户界面时)。然后它将结果返回给UI线程,以便您更新UI。

public Task<TodoItem> GetItemAsync(int id)
{
    return database.Table<TodoItem>().Where(i => i.ID == id).FirstOrDefaultAsync();
}