我的代码:
public async Task LoadRecentlyRatedBooks()
{
RecentlyRatedBooks.Clear();
try
{
var books = await App.CurrentApplication
.BookRequests
.GetBooksByCategory(BookListCategory.News, 10, 0);
if (books != null)
{
foreach (var book in books)
{
var bookViewModel = AddBook(book);
if (bookViewModel != null)
{
RecentlyRatedBooks.Add(bookViewModel);
}
}
}
}
catch(Exception ex)
{ }
}
public async Task<IEnumerable<Book>>
GetBooksByCategory(BookListCategory category, uint limit, uint offset)
{
var request = CreateBookListURL(category, limit, offset);
var response = await client.GetResponseAsyncEx<List<Book>>(request);
return response.Data;
}
我在await
语句后调用代码时遇到问题。我的应用程序在GetBooksByCategory()
方法中到达return语句,但在await
语句后它永远不会到达代码。我尝试将断点放到catch
- 阻止或包含if (books != null)
的行,但没有成功。应用程序从未到达这些断点。
我现在在Windows 7上使用Visual Studio 2010.还安装了Visual Studio 2012 for Desktop。
我确信我的代码在Windows 8上使用Visual Studio 2012 for WP。 我想知道为什么它不适用于VS 2010的Windows 7。
链接到包含我的代码的存储库:https://bitbucket.org/chovik/smartlib-mu-wp
答案 0 :(得分:1)
我已经下载了你的.zip解决方案,但它包含了通过Nuget获得的软件包中的dll,即用于从VS2012定位.NET 4.0并且仅从安装了.NET 4.5的机器运行的dll。一个人也不能使用C#5.0扩展来从VS 2012 在VS2010上到Async Targeting Pack
定位.NET 4.0为了在VS2010中使用async / await,不应该使用由.NET 4.5安装升级的Nuget或.NET 4.0(换句话说,安装.NET 4.5)。
请参阅我的答案:
更新:
再次引用"Proper way to use Async with VS 2010 now that VS 2012 is released"
“Async CTP是在Visual Studio 2010中使用async的唯一方法。 但是,它不是异步进入.NET 4.5 / Visual Studio 2012“
在MSDN论坛上也有一个热门讨论:
答案 1 :(得分:0)
您确定“GetResponseAsyncEx”实际上正在执行吗?你能告诉我们它的源代码吗?
这只是一个完整的猜测,但可能值得一试。
public async Task LoadRecentlyRatedBooks()
{
RecentlyRatedBooks.Clear();
try
{
var books = await App.CurrentApplication.BookRequests.GetBooksByCategory(BookListCategory.News, 10, 0);
if (books != null)
{
foreach (var book in books)
{
var bookViewModel = AddBook(book);
if (bookViewModel != null)
{
RecentlyRatedBooks.Add(bookViewModel);
}
}
}
}
catch(Exception ex)
{
}
}
public async Task<IEnumerable<Book>> GetBooksByCategory(BookListCategory category, uint limit, uint offset)
{
var request = CreateBookListURL(category, limit, offset);
return client.GetResponseAsyncEx<List<Book>>(request);
}
答案 2 :(得分:0)
很可能是因为没有等待包含对LoadRecentlyRatedBooks
的调用的方法而导致死锁。例如,您的ReloadCommand
getter(在SmartLib \ MVVM \ ViewModels \ ServerBooksViewModel.cs中)是这样的候选者
请注意,由于某种原因,我无法在VS中打开您的项目,所以我只在记事本中扫描您的文件 - 可能还有其他类似的事件发生。
使用async / await
查看Stephen Cleary关于死锁的帖子