C# Cosmos DB调用永远不会返回异步调用
我在WebApi中有一个方法,它通过SQL API调用Cosmos,SQL API返回流程配置文件,但永远不会返回。任务悬而未决,永远无法完成。我可以在调试中的“线程”窗口中看到该任务。对同一数据库容器的其他调用运行正常。几次呼叫后,我必须重新启动IIS以清除任务。没有抛出异常。我已经试过了,也试过了。复制到另一个控制台应用程序项目中的相同方法可以正常工作。是否有任何已知的宇宙计时问题导致结果过大?这应该只返回2个项目。该行为与在本地运行的实时Cosmos DB和Cosmos仿真器相同 我用的是最新的Cosmos软件包C# Cosmos DB调用永远不会返回异步调用,c#,azure,azure-cosmosdb,C#,Azure,Azure Cosmosdb,我在WebApi中有一个方法,它通过SQL API调用Cosmos,SQL API返回流程配置文件,但永远不会返回。任务悬而未决,永远无法完成。我可以在调试中的“线程”窗口中看到该任务。对同一数据库容器的其他调用运行正常。几次呼叫后,我必须重新启动IIS以清除任务。没有抛出异常。我已经试过了,也试过了。复制到另一个控制台应用程序项目中的相同方法可以正常工作。是否有任何已知的宇宙计时问题导致结果过大?这应该只返回2个项目。该行为与在本地运行的实时Cosmos DB和Cosmos仿真器相同 我用的是
<package id="Microsoft.Azure.Cosmos" version="3.3.2" targetFramework="net472" />
此方法从不从wait items.ReadNextAsync()返回
公共异步任务GetConfigurationList()
{
var值=新字典();
var query=new QueryDefinition(“从c中选择c.ConfigId、c.ConfigDescription,其中c.DataSourceType='CSV');
var items=container.getItemQueryInterator(查询);
while(items.HasMoreResults)
{
FeedResponse configs=等待项。ReadNextAsync();
foreach(配置中的var项)
{
添加(item.ConfigId,item.ConfigDescription);
}
}
返回值;
}
这种方法每次都很有效
public async Task<LetterConfiguration> GetConfiguration(int id)
{
var query = new QueryDefinition("SELECT * FROM c where c.ConfigId= @id").WithParameter("@id",id);
var configItems = container.GetItemQueryIterator<ConfigFile>(query);
while (configItems.HasMoreResults)
{
FeedResponse<ConfigFile> configs = await configItems.ReadNextAsync();
if(configs.Count == 1)
{
return configs.FirstOrDefault();
}
}
return null;
}
public异步任务GetConfiguration(int-id)
{
var query=new QueryDefinition(“SELECT*FROM c,其中c.ConfigId=@id”)。带有参数(“@id”,id);
var configItems=container.getItemQueryInterator(查询);
while(configItems.HasMoreResults)
{
FeedResponse configs=等待configItems.ReadNextAsync();
如果(configs.Count==1)
{
返回configs.FirstOrDefault();
}
}
返回null;
}
两条建议:
var query = new QueryDefinition("SELECT c.ConfigId, c.ConfigDescription FROM c where c.DataSourceType='CSV'");
var items = container.GetItemQueryStreamIterator(query);
while (items.HasMoreResults)
{
using (ResponseMessage response = await items.ReadNextAsync())
{
using (StreamReader sReader = new StreamReader(response.Content))
using (JsonTextReader jsonReader = new JsonTextReader(sReader))
{
JsonSerializer jsonSerializer = new JsonSerializer();
dynamic values = jsonSerializer.Deserialize<dynamic>(jsonReader).Documents;
Console.WriteLine($"Name: {values[0].ConfigId}");
}
}
}
var query=newquerydefinition(“从c中选择c.ConfigId、c.ConfigDescription,其中c.DataSourceType='CSV');
var items=container.GetItemQueryStreamIterator(查询);
while(items.HasMoreResults)
{
使用(ResponseMessage response=wait items.ReadNextAsync())
{
使用(StreamReader sReader=newstreamreader(response.Content))
使用(JsonTextReader jsonReader=newjsontextreader(sReader))
{
JsonSerializer JsonSerializer=新的JsonSerializer();
动态值=jsonSerializer.Deserialize(jsonReader).Documents;
Console.WriteLine($”名称:{values[0].ConfigId}”);
}
}
}
两条建议:
var query = new QueryDefinition("SELECT c.ConfigId, c.ConfigDescription FROM c where c.DataSourceType='CSV'");
var items = container.GetItemQueryStreamIterator(query);
while (items.HasMoreResults)
{
using (ResponseMessage response = await items.ReadNextAsync())
{
using (StreamReader sReader = new StreamReader(response.Content))
using (JsonTextReader jsonReader = new JsonTextReader(sReader))
{
JsonSerializer jsonSerializer = new JsonSerializer();
dynamic values = jsonSerializer.Deserialize<dynamic>(jsonReader).Documents;
Console.WriteLine($"Name: {values[0].ConfigId}");
}
}
}
var query=newquerydefinition(“从c中选择c.ConfigId、c.ConfigDescription,其中c.DataSourceType='CSV');
var items=container.GetItemQueryStreamIterator(查询);
while(items.HasMoreResults)
{
使用(ResponseMessage response=wait items.ReadNextAsync())
{
使用(StreamReader sReader=newstreamreader(response.Content))
使用(JsonTextReader jsonReader=newjsontextreader(sReader))
{
JsonSerializer JsonSerializer=新的JsonSerializer();
动态值=jsonSerializer.Deserialize(jsonReader).Documents;
Console.WriteLine($”名称:{values[0].ConfigId}”);
}
}
}
这最终导致调用存储库方法的控制器中缺少等待。感谢大家的投入。这最终成为调用存储库方法的控制器中缺少的等待。感谢大家的参与。如果在方法GetConfigurationList
中使用类型化对象,即ConfigFile
而不是Tuple
,会发生什么。还有一些其他问题-您正在开发的应用程序是什么?在链中的任何位置,您的代码是否打破了异步/等待模式?建议使用ConfigureAwait(false)
进行异步调用。使用类型化对象也可以做同样的事情。我试图对其进行元组分析,以确定是否存在数据量问题。异步/等待从控制器一直使用到存储库。该应用程序用于生成格式信函。配置文件定义了如何在不同表单上填充数据。我尝试了ConfigureAwait(false),但它仍然没有返回。如果在Web API方法的末尾(最后一行)添加断点,它会被命中吗?如果是,您可能在某个地方丢失了一些wait
,并丢失了异步上下文断点永远不会被命中,来自调用方(招摇过市用户界面、邮递员)的请求永远不会完成。@kekindt-当您直接在Comos DB查询刀片(在Azure门户中)中运行此查询时那么查询是否会产生任何结果?如果在方法GetConfigurationList
中使用类型化对象,即ConfigFile
而不是Tuple
,会发生什么情况。还有一些其他问题-您正在开发的应用程序是什么?在链中的任何位置,您的代码是否打破了异步/等待模式?建议使用ConfigureAwait(false)
进行异步调用。使用类型化对象也可以做同样的事情。我试图对其进行元组分析,以确定是否存在数据量问题。异步/等待从控制器一直使用到存储库。该应用程序用于生成格式信函。
var query = new QueryDefinition("SELECT c.ConfigId, c.ConfigDescription FROM c where c.DataSourceType='CSV'");
var items = container.GetItemQueryStreamIterator(query);
while (items.HasMoreResults)
{
using (ResponseMessage response = await items.ReadNextAsync())
{
using (StreamReader sReader = new StreamReader(response.Content))
using (JsonTextReader jsonReader = new JsonTextReader(sReader))
{
JsonSerializer jsonSerializer = new JsonSerializer();
dynamic values = jsonSerializer.Deserialize<dynamic>(jsonReader).Documents;
Console.WriteLine($"Name: {values[0].ConfigId}");
}
}
}