带有 ASP.NET Web 窗体的 Azure CosmosDB SDK v3
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().Result的执行永远不会结束(无超时)。
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
.
造成的死锁造成的
有无数资源可以解释这个僵局,但我会 link this answer 来自 Whosebug。
TL;DR 是您在 UI 线程中阻塞了导致死锁的异步调用。您需要像这样正确等待您的来电:
FeedResponse<dynamic> currentResultSet = await queryResultSetIterator.ReadNextAsync();
如果您使用 ConfigureAwait(false)
方法,您可以在技术上阻止调用,但 v3 SDK 不会将此调用一直级联到网络调用,因此不会有任何区别。 WebForms 允许您拥有异步处理程序,因此您可以让您的方法异步并重试。
我对以下代码有疑问,它在控制台应用程序项目中运行良好,但在 ASP.NET Web 窗体项目中运行不佳,两者都针对 .NET Framework 4.7.2。
目标是使用最新的Azure Cosmos DB SDK (v3)获取容器中的所有文档,而不指定类型(使用动态)。
我尝试同时针对模拟器(最新版本 2.4.5)和 Azure Cosmos 服务。
在ASP.NET项目中,queryResultSetIterator.ReadNextAsync().Result的执行永远不会结束(无超时)。
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
.
有无数资源可以解释这个僵局,但我会 link this answer 来自 Whosebug。
TL;DR 是您在 UI 线程中阻塞了导致死锁的异步调用。您需要像这样正确等待您的来电:
FeedResponse<dynamic> currentResultSet = await queryResultSetIterator.ReadNextAsync();
如果您使用 ConfigureAwait(false)
方法,您可以在技术上阻止调用,但 v3 SDK 不会将此调用一直级联到网络调用,因此不会有任何区别。 WebForms 允许您拥有异步处理程序,因此您可以让您的方法异步并重试。