Azure CosmosDB SDK v3 with ASP.NET Web Forms



我对以下代码有一个问题,在控制台应用程序项目中运行良好,而在 ASP.NET Web 窗体项目中不起作用,两者都面向 .NET Framework 4.7.2。

目标是使用最后一个 Azure Cosmos DB SDK (v3( 获取容器中的所有文档,而无需指定类型(使用动态(。

我尝试同时针对模拟器(最新版本 2.4.5(和 Azure Cosmos 服务。

在 ASP.NET 项目中,执行 queryResultSetIterator.ReadNextAsync((。结果永远不会结束(无超时(。

string endpointUri = "https://localhost:8081";
string primaryKey = "C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==";
string database = "SendGridEvents";
string collection = "SendGridEvents";
using (CosmosClient client = new CosmosClient(endpointUri, primaryKey))
{
Container container = client.GetDatabase(database).GetContainer(collection);
QueryDefinition queryDefinition = new QueryDefinition("SELECT * FROM c");
FeedIterator<dynamic> queryResultSetIterator = container.GetItemQueryIterator<dynamic>(queryDefinition);
List<dynamic> documents = new List<dynamic>();
while (queryResultSetIterator.HasMoreResults)
{
FeedResponse<dynamic> currentResultSet = queryResultSetIterator.ReadNextAsync().Result;
foreach (var document in currentResultSet)
{
documents.Add(document);
}
}
}

这是由于使用有问题的.Result而导致的死锁。

有无数的来源可以解释这种僵局,但我将从StackOverflow链接这个答案。

TL;DR 是您在 UI 线程中阻止了导致死锁的异步调用。您需要像这样正确等待您的电话:

FeedResponse<dynamic> currentResultSet = await queryResultSetIterator.ReadNextAsync();

如果使用ConfigureAwait(false)方法,则从技术上可以阻止调用,但 v3 SDK 不会将此调用一直级联到网络调用,因此不会产生任何影响。WebForms 允许您使用异步处理程序,因此您可以将方法设置为异步并重试。

最新更新