2013-07-26 61 views
0

我有一個WPF窗體,其中有幾個選項卡。當我加載窗體時,我也嘗試在某些選項卡的背景中加載一些數據。使用任務加載數據仍然掛起UI

的代碼看起來是這樣的:

public static List<MyModel> GetCaseNotes(int someId) 
{ 
    return GetCaseNotesAsync(debtorId).Result; 
} 

public static async Task<List<MyModel>> GetCaseNotesAsync(int someId) 
{ 
    Task<List<MyModel>> tsk = Task.Run(() => GetCaseNotesFromDb(someId)); 


    return await tsk.ConfigureAwait(false); 

} 

public static List<MyModel> GetCaseNotesFromDb(int debtorId) 
{ 

    //get some data from database 
} 

然而,UI仍在等待從數據庫中取得的數據...任何想法?

回答

5

Result將阻塞,直到任務完成。您通過使用ConfigureAwait來避免deadlock I describe on my blog,但您仍然明確阻止。

當異步加載數據時,您需要爲UI設計「加載」狀態,並在加載完成時更新它。我有另一篇關於asynchronous construction/initialization的博客文章,您可能會發現它很有用,特別是我的NotifyTaskCompletion type嘗試使任務更易於數據綁定。

+0

偉大的博文在博客!我是新手,這很有用。 –

2
return GetCaseNotesAsync(debtorId).Result; 

應該

return await GetCaseNotesAsync(debtorId); 

當您在TaskResult,你等待同步的結果,而不是異步。

0

因爲您有異步方法但同步調用它。 在不等待的情況下調用異步方法將導致其表現爲同步方法

爲了異步調用它,你應該這樣稱呼它

return await GetCaseNotesAsync(debtorId); 
+1

如果你使用'await',你不希望'.Result'結尾 –

+0

@TrevorPilley絕對正確。複製粘貼問題。 :)更新 – Ehsan