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ステートメントの後にコードを呼び出すことに問題があります。私のアプリケーションはメソッド内の return ステートメントに到達しますが、ステートメントGetBooksByCategory()の後にコードに到達することはありませんawaitcatch-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 をターゲットにし、.NET 4.5 がインストールされているマシンからのみ実行可能な dll です。Async Targeting Packを介して VS2010 上の VS 2012 から .NET 4.0 をターゲットにするために C# 5.0 拡張機能を使用することもできません。

VS2010 で async/await を使用するには、.NET 4.5 のインストールによってアップグレードされた Nuget または .NET 4.0 を使用しないでください (つまり、.NET 4.5 をインストールする必要があります)。

私の答えを見てください:

更新:
もう一度、「VS 2012 がリリースされたので、VS 2010 で Async を使用する適切な方法」からの回答を引用します。

「非同期 CTP は、Visual Studio 2010 で非同期を使用する唯一の方法です。ただし、.NET 4.5 / Visual Studio 2012 に組み込まれたのは非同期ではありません」

MSDN フォーラムでも大きな議論がありました。

于 2013-04-26T17:39:06.307 に答える
0

への呼び出しを含むメソッドを待機しないことによって、デッドロックが発生している可能性がありますLoadRecentlyRatedBooks。たとえば、ReloadCommandゲッター (SmartLib\MVVM\ViewModels\ServerBooksViewModel.cs 内) はそのような候補です。

何らかの理由で VS でプロジェクトを開くことができなかったため、メモ帳でファイルをスキャンしただけであることに注意してください。

async/await を使用したデッドロックに関する Stephen Cleary の投稿を確認してください。

于 2013-04-26T17:27:48.013 に答える