2

これは、10 番目のクラス A セクションのすべての学生を取得するために DocumentDB のページングを実装しようとしているコードです。

コンソールアプリケーションでは問題なく動作しています。

しかし、Web アプリケーションで実行しようとすると、非同期呼び出し (つまり、query.ExecuteNextAsync()) でプロセスが終了し、例外も発生しません。

public List<Student> allStudents()
        {
            int class = 10;
            string section = "A";
            string documentType = "Student";
            List<Student> students = new List<Student>();
            string DocumentDBCollectionLink = "CollectionLink";
            DocumentClient dc = new DocumentClient(new Uri("https://xyz.documents.azure.com:443/"), "authenticationKey==");
            IDocumentQuery<Student> query;
            String continuation = "";
            do
            {
                FeedOptions feedOptions = new FeedOptions { MaxItemCount = 10, RequestContinuation = continuation };
                query = dc.CreateDocumentQuery<Student>(DocumentDBCollectionLink, feedOptions).Where(d => d.Type.Equals(documentType) && d.Class.Equals(class) && d.Section.Equals(section)).AsDocumentQuery();

                FeedResponse<Student> pagedResults = this.getRecords(query).Result;
                foreach (Student system in pagedResults)
                {
                    students.Add(system);
                }
                continuation = pagedResults.ResponseContinuation;
            } while (!String.IsNullOrEmpty(continuation));
            return students;
        }
    private async Task<FeedResponse<Student>> getRecords(IDocumentQuery<Student> query)
    {
        FeedResponse<Student> pagedResults = await query.ExecuteNextAsync<Student>();
        return pagedResults;
    }

コンソール アプリケーションでは実行されているのに、Web アプリケーションでは実行されていない理由がわかりません。

これで何か問題がありますか?

または、結果を取得するためのより良い方法はありますか?

どんな助けでも大歓迎です。

前もって感謝します。

4

5 に答える 5

2

すべての非同期メソッドは、Web 呼び出しで ConfigureAwait(false) にする必要があります

query.ExecuteNextAsync().ConfigureAwait(false)
于 2016-10-25T05:06:02.897 に答える
0

結果が返されないため、ConfigureAwait(false) は使用しないでください。また、非同期コードと同期コードを混在させないでください。災害時の領収書です。.Result が機能すると言う人がいるとしても、信じてください。非同期コンテキストで実行されているサーバー環境では機能しません。なぜうまくいかないのかは、長い話です。今のところ説明はしません:)

だからこれに行きます:

 public async List<Student> allStudentsAsync()
        {

         result = new List<Student>();
        while (query.HasMoreResults)
        {
            var response = await query.ExecuteNextAsync<T>();
                         result.AddRange(response);
        }
于 2017-04-14T08:12:21.240 に答える