Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Cosmos DB调用永远不会返回异步调用_C#_Azure_Azure Cosmosdb - Fatal编程技术网

C# Cosmos DB调用永远不会返回异步调用

C# Cosmos DB调用永远不会返回异步调用,c#,azure,azure-cosmosdb,C#,Azure,Azure Cosmosdb,我在WebApi中有一个方法,它通过SQL API调用Cosmos,SQL API返回流程配置文件,但永远不会返回。任务悬而未决,永远无法完成。我可以在调试中的“线程”窗口中看到该任务。对同一数据库容器的其他调用运行正常。几次呼叫后,我必须重新启动IIS以清除任务。没有抛出异常。我已经试过了,也试过了。复制到另一个控制台应用程序项目中的相同方法可以正常工作。是否有任何已知的宇宙计时问题导致结果过大?这应该只返回2个项目。该行为与在本地运行的实时Cosmos DB和Cosmos仿真器相同 我用的是

我在WebApi中有一个方法,它通过SQL API调用Cosmos,SQL API返回流程配置文件,但永远不会返回。任务悬而未决,永远无法完成。我可以在调试中的“线程”窗口中看到该任务。对同一数据库容器的其他调用运行正常。几次呼叫后,我必须重新启动IIS以清除任务。没有抛出异常。我已经试过了,也试过了。复制到另一个控制台应用程序项目中的相同方法可以正常工作。是否有任何已知的宇宙计时问题导致结果过大?这应该只返回2个项目。该行为与在本地运行的实时Cosmos DB和Cosmos仿真器相同

我用的是最新的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;
}

两条建议:

  • 您是否检查了在调用ReadNextAsync时是否存在任何异常?使用Try…Catch

  • 对GetItemQueryIterator和FeedResponse使用类型化对象

  • 更新:尝试此方法查询选定字段-

                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}”);
    }
    }
    }
    
    两条建议:

  • 您是否检查了在调用ReadNextAsync时是否存在任何异常?使用Try…Catch

  • 对GetItemQueryIterator和FeedResponse使用类型化对象

  • 更新:尝试此方法查询选定字段-

                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}");
                        }
                    }
                }