c# - 带有 ASP.NET Web 表单的 Azure CosmosDB SDK v3

标签 c# asp.net azure webforms azure-cosmosdb

以下代码存在问题,在控制台应用程序项目中运行良好,但在 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而导致死锁造成的。 .

有无数的来源可以解释这种僵局,但我将链接 this answer来自 StackOverflow。

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

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

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

关于c# - 带有 ASP.NET Web 表单的 Azure CosmosDB SDK v3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57604770/

相关文章:

powershell - 如何导出 Azure 订阅上的 "administrators"列表?

azure - Service Fabric 应用程序 vmImageSku

c# - Winforms 应用程序停止绘图但仍对事件有反应

c# - 堆栈跟踪中方法名称末尾的 "+n"值是什么意思?

asp.net - 何时在 ASP.NET MVC 应用程序生命周期中处置静态资源

c# - 重写 System.Web.Security.Roles 函数?

c# - c#中将格式化的时间字符串保存为文件名问题

c# - Create View后返回的ViewModel为空

c# - 命名空间 'Linq' 中不存在类型或命名空间名称 'System'

excel - 仅使用 VBA 将数据从 Excel 365 上传到 Azure Sql Server