2013-03-10 45 views
0

我有一個利用SQLite的Windows Phone 8應用程序。Windows Phone 8 SQLite異步操作無限期掛起

我有哪裏一些異步SQLite的操作都會掛起問題

這裏有一個這樣的操作(大概是因爲他們正在等待?):

SQLiteAsyncConnection conn = new SQLiteAsyncConnection("myDatabase"); 
var query = conn.Table<MyTable>().Where(x => x.Name == "name"); 
var result = await query.ToListAsync(); 

foreach (var item in result) 
{ 
// breakpoint in the code here is never reached 
} 

這是它返回一個任務異步方法< string>

此方法從主頁面代碼中提前調用。主頁從來沒有真正建立,因爲應用程序掛在這個方法上(屏幕上只是說「正在加載...」,直到我停下來)

回答

2

我猜測你的調用棧進一步向上(例如,在你的主頁代碼),您打電話ResultTask<T>。這會使你的程序陷入僵局。我在我的Best Practices in Asynchronous Programming文章和我的Don't Block on Async Code博文中詳細解釋了這一點。

總結:當你await未完成Task,默認情況下,當前上下文被捕獲並使用Task完成後恢復的async方法的其餘部分。在你的情況下,捕獲的上下文是一個UI上下文,它只能在指定的線程(UI線程)上運行。

因此,您的主頁代碼將調用您的async方法,即await的操作(捕獲UI上下文)。你的async代碼返回一個未完成的Task到您的主頁代碼,其上調用ResultResult將(同步)阻塞,直到Task完成。當ToListAsync操作完成時,它會嘗試在捕獲的(UI)上下文中執行其餘的async方法。但UI線程繁忙;它被阻止,等待Task完成。因此,僵局。