使用 Web 应用程序在 DocumentDB 中分页
Paging in DocumentDB with Web application
这是我正在尝试为 DocumentDB 实现分页以使所有学生都在第 10 class 节中的代码。
它在控制台应用程序中运行良好。
但是当我尝试在我的 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 应用程序中执行。
这有什么问题吗?
或者有什么更好的方法来得到结果?
如有任何帮助,我们将不胜感激。
提前致谢。
FeedResponse pagedResults = query.ExecuteNextAsync().Result;
它对我来说工作正常,但我需要它不工作的原因
尝试使用
FeedResponse pagedResults = query.ExecuteNextAsync().Result;
检查这个
FeedResponse pagedResults = query.ExecuteNextAsync().Result;
这一行以阻塞方式调用了异步方法,在asp.net环境下可能会导致死锁。
参见:http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html
所有异步方法在网络调用中都应该是 ConfigureAwait(false)
query.ExecuteNextAsync().ConfigureAwait(false)
不要使用 ConfigureAwait(false),因为您不会得到返回的结果。
另外,不要将异步代码与同步代码混合使用。这是灾难的收据。即使有人说 .Result -works-,相信我,它在异步上下文中的服务器环境 运行 中也行不通。 -为什么-它不起作用,这是一个很长的故事。我暂时不想解释:)
所以去做这个:
public async List<Student> allStudentsAsync()
{
result = new List<Student>();
while (query.HasMoreResults)
{
var response = await query.ExecuteNextAsync<T>();
result.AddRange(response);
}
这是我正在尝试为 DocumentDB 实现分页以使所有学生都在第 10 class 节中的代码。
它在控制台应用程序中运行良好。
但是当我尝试在我的 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 应用程序中执行。
这有什么问题吗?
或者有什么更好的方法来得到结果?
如有任何帮助,我们将不胜感激。
提前致谢。
FeedResponse pagedResults = query.ExecuteNextAsync().Result;
它对我来说工作正常,但我需要它不工作的原因
尝试使用
FeedResponse pagedResults = query.ExecuteNextAsync().Result;
检查这个
FeedResponse pagedResults = query.ExecuteNextAsync().Result;
这一行以阻塞方式调用了异步方法,在asp.net环境下可能会导致死锁。 参见:http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html
所有异步方法在网络调用中都应该是 ConfigureAwait(false)
query.ExecuteNextAsync().ConfigureAwait(false)
不要使用 ConfigureAwait(false),因为您不会得到返回的结果。 另外,不要将异步代码与同步代码混合使用。这是灾难的收据。即使有人说 .Result -works-,相信我,它在异步上下文中的服务器环境 运行 中也行不通。 -为什么-它不起作用,这是一个很长的故事。我暂时不想解释:)
所以去做这个:
public async List<Student> allStudentsAsync()
{
result = new List<Student>();
while (query.HasMoreResults)
{
var response = await query.ExecuteNextAsync<T>();
result.AddRange(response);
}