2013-03-10 61 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完成。因此,僵局。