c# - 带有 ASP.NET Web 窗体的 Azure CosmosDB SDK v3
问题描述
我对以下代码有疑问,在控制台应用程序项目中运行良好,但在 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
。
有无数来源可以解释这种死锁,但我会从 StackOverflow链接这个答案。
TL;DR 是您正在阻止导致死锁的 UI 线程中的其他异步调用。您需要像这样正确等待您的电话:
FeedResponse<dynamic> currentResultSet = await queryResultSetIterator.ReadNextAsync();
如果您使用该ConfigureAwait(false)
方法,您可以在技术上阻止调用,但 v3 SDK 不会将此调用一直级联到网络调用,因此不会有任何区别。WebForms 允许您拥有异步处理程序,因此您可以使您的方法异步并重试。
推荐阅读
- youtube - PierfrancescoSoffritti -android-youtube-player 是否支持广告?
- web-scraping - web scraping gearbest with python
- html - Next.JS 中的 TailwindCSS 在 Webkit 中无法正确呈现
- flutter - Drawing a shape with dimensions in millimeters
- c# - Controller's action is getting called twice while loading a view
- javascript - 影响文本单击到 Reactjs 中的复选框
- android - 非常大的数据使我的应用程序在使用 ScrollView 时非常慢
- javascript - MapBox GL Javascript - 集群 - 计数不显示
- ios - 如何在 iOS 的 SwiftUI 中检测 TextField 何时失去焦点?
- ubuntu - 构建模块时“不支持内核包 linux-headers-5.0.0-2173611831”