2017-07-16 39 views
1

在我的應用程序有以下幾點:異步表的建立和查詢的優勢/劣勢

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

從我瞭解有一個異步的方式來做到這一點也:

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

誰能解釋如果我在使用異步方式方面有什麼優勢,並且人們通常總是使用異步方式?

也有可能是好處,如果我使用這種類型的異步查詢:

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

請在提問之前試着研究一下這個話題。我建議從這裏開始閱讀有關c#中的異步:https://msdn.microsoft.com/library/hh191443(vs.110).aspx – hamalaiv

+0

CreateTableAsync將讓UI線程工作,而使用CreateTable不會。根據您執行代碼的時間(在開始時,在用戶交互之後,您將需要使用Async或不)。 – hugoterelle

+0

你的回答hugorgor在這個例子中誤導了,因爲問題有'.Wait();'異步方法之後再次阻塞UI線程。 – hamalaiv

回答

1

當調用主(UI)的方法線程都在UI停止,只要它需要的是方法來執行。如果db2.CreateTable<CategoryGroup>()在做這件事時不佔用太多時間,這應該不成問題。

耗費大量耗時的操作可能會影響您的用戶界面並使其凍結。

調用*Async變體的方法通過任務API將工作移動到後臺線程。儘管如此,在該任務上調用Wait()會使當前線程(在本例中爲UI線程)等待任務完成,並且遇到同樣的問題。

你應該總是await任務:await database.CreateTableAsync<TodoItem>()。這會讓它在後臺線程上執行,而不是讓當前線程等待它完成。代碼中的下一行直到任務完成後纔會執行。當你編寫代碼時,它使'異步變體看起來像它的行爲像普通版本。

就我個人而言,我可能會將所有的方法都轉移到一個任務中,然後等待。你不是每個任務之間返回到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線程以使您能夠更新UI。

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