在我的申请表中,我有以下内容:
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();
}
答案 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();
}