未达到等待声明后的代码

时间:2013-04-26 15:43:25

标签: c# visual-studio-2010 windows-phone-7 async-await async-ctp

我的代码:

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

3 个答案:

答案 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关于死锁的帖子