3

我的代码:

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-block 或包含if (books != null)但没有成功的行。应用程序永远不会到达这些断点。

我现在在 Windows 7 上使用 Visual Studio 2010。还安装了 Visual Studio 2012 for Desktop。

我确定我的代码可以在带有 Visual Studio 2012 for WP 的 Windows 8 上运行。我想知道为什么它不能在带有 VS 2010 的 Windows 7 上运行。

链接到包含我的代码的存储库:https ://bitbucket.org/chovik/smartlib-mu-wp

4

3 回答 3

1

我已经下载了你的 .zip 解决方案,但它包含通过 Nuget 获得的包中的 dll,即用于从 VS2012 定位 .NET 4.0 的 dll,并且只能从安装了 .NET 4.5 的机器上运行。也不能使用 C# 5.0 扩展在 VS2010 上通过Async Targeting Pack从 VS 2012 定位 .NET 4.0

为了在 VS2010 中使用 async/await,不应使用 Nuget 或通过 .NET 4.5 安装升级的 .NET 4.0(换句话说,要安装 .NET 4.5)。

请参阅我对以下内容的回答:

更新:
再次引用“在 VS 2012 发布后正确使用 Async 与 VS 2010 的方法”的答案

“Async CTP 是在 Visual Studio 2010 中使用 async 的唯一方法。但是,将其引入 .NET 4.5 / Visual Studio 2012 的并不是 async”

在 MSDN 论坛上也出现了很大的热议:

于 2013-04-26T17:39:06.307 回答
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);
}
于 2013-04-26T15:59:21.587 回答
0

您很可能会因为不等待包含对LoadRecentlyRatedBooks. 例如,您的ReloadCommandgetter(在 SmartLib\MVVM\ViewModels\ServerBooksViewModel.cs 中)就是这样的候选人

请注意,由于某种原因,我无法在 VS 中打开您的项目,所以我只在记事本中扫描了您的文件 - 可能还有其他此类事件。

查看 Stephen Cleary 关于 async/await 死锁的帖子

于 2013-04-26T17:27:48.013 回答