0

我有一个使用 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<string>

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

4

1 回答 1

2

我猜你的调用堆栈(例如,在你的主页代码中)更进一步,你正在Result调用Task<T>. 这将使您的程序陷入僵局。我在我的异步编程最佳实践文章和不要阻塞异步代码博文中详细解释了这一点。

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

因此,您的主页代码调用您的操作async方法(捕获 UI 上下文)。您的代码返回一个未完成的调用它的主页代码。将(同步)阻塞直到完成。操作完成后,它会尝试在捕获的 (UI) 上下文中执行其余的方法。但是UI线程很忙;它被阻止等待完成。于是,陷入僵局。awaitToListAsyncasyncTaskResultResultTaskToListAsyncasyncTask

于 2013-03-11T03:33:08.013 回答