Windows Phone 8 SQLite异步操作无限期挂起

时间:2013-03-10 21:39:47

标签: sqlite windows-phone-8

我有一个使用SQLite的Windows Phone 8应用程序。

我遇到一些问题,其中一些异步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
}

这是一个异步方法,它返回一个Task&lt;串GT;

从主页面代码中提前调用此方法。主页面从未实际构建,因为应用程序挂在此方法上(屏幕只是无限期地说“正在加载......”直到我停止)

1 个答案:

答案 0 :(得分:2)

我猜你的调用堆栈更进一步(例如,在你的主页代码中),你在Result上呼叫Task<T>。这将使你的程序陷入僵局。我在Best Practices in Asynchronous Programming文章和我的Don't Block on Async Code博文中详细解释了这一点。

总结:当您await未完成Task时,默认情况下会捕获当前上下文,并在async完成后用于恢复Task方法的其余部分。在您的情况下,捕获的上下文是一个UI上下文,它只在指定的线程(UI线程)上运行。

因此,您的主页面代码调用async方法await ToListAsync操作(捕获UI上下文)。您的async代码会向您的主页代码返回一个未完成的Task,并在其上调用ResultResult将(同步)阻止,直到Task完成。当ToListAsync操作完成时,它会尝试在捕获的(UI)上下文中执行其余的async方法。但UI线程很忙;它被阻止等待Task完成。因此,僵局。