WPF CosmosDB ReadNextAsync()在后台调用时挂起

WPF CosmosDB ReadNextAsync()在后台调用时挂起,wpf,async-await,azure-cosmosdb,Wpf,Async Await,Azure Cosmosdb,在WPF中,我有一个后台工作人员,我必须向Cosmos DB发出请求,请求使用迭代器: \u worker\u GenerateReport.DoWork+=\u worker\u GenerateReport\u DoWork; 这是backgroundWorker的方法: void\u worker\u GenerateReport\u DoWork(对象发送方,DoWorkEventArgs e) var result=QueryItemsAsync2(connectionString,

在WPF中,我有一个后台工作人员,我必须向Cosmos DB发出请求,请求使用迭代器:

\u worker\u GenerateReport.DoWork+=\u worker\u GenerateReport\u DoWork;
这是backgroundWorker的方法:

void\u worker\u GenerateReport\u DoWork(对象发送方,DoWorkEventArgs e)
var result=QueryItemsAsync2(connectionString,queryDownloadData.ToString());
方法。在这个方法中,
GetAwaiter().GetResult()它挂起:

专用异步任务QueryItemsAsync2(
ConnectionString连接字符串,字符串sqlQueryText)
{
QueryDefinition QueryDefinition=新的QueryDefinition(sqlQueryText);
var container=cosmosClient.GetContainer(connectionString.DatabaseID,
连接字符串集合);
FeedIterator结果集=
container.getItemQueryInterator(queryDefinition,
requestOptions:new QueryRequestOptions()
{
//MaxItemCount=1000,
MaxConcurrency=1
});
while(resultSet.HasMoreResults)
{
任务响应=resultSet.ReadNextAsync();
var result=response.GetAwaiter().GetResult();
}
}

我得再写一次。我删除了
BackgroundWorker
,我发现问题在于从
CosmosDB
获取项目。 现在我有了xaml按钮:

<Button VerticalAlignment="Bottom" Grid.Row="1" HorizontalAlignment="Left"   Command="{Binding Path=Command_GenerateReport2}" IsEnabled="{Binding Path=IsUIEnabled, UpdateSourceTrigger=PropertyChanged}">report2</Button>
方法generateReport2:

  private void generateReport2()
  {
       ConnectionString connectionString = CreateConnectionStringAzureDB(serverToUse);

       string queryTest = " SELECT * FROM c WHERE c.Proj = 2544912 ";

       var result = QueryItemsAsync2(connectionString, queryTest);
   }
和方法QueryItemsAsync2:

private async Task<IEnumerable<DTO_Proj>> QueryItemsAsync2(ConnectionString connectionString, string sqlQueryText)
  {
            QueryDefinition queryDefinition = new QueryDefinition(sqlQueryText);

            var container = cosmosClient.GetContainer(connectionString.DatabaseID, connectionString.Collection);

            FeedIterator<DTO_Proj> resultSet = container.GetItemQueryIterator<DTO_Proj>(
                queryDefinition,
                requestOptions: new QueryRequestOptions()
                {
                    MaxItemCount = 1000,
                    MaxConcurrency = 1
                });

    while (resultSet.HasMoreResults)
                {
                    Task<FeedResponse<DTO_Proj>> response = resultSet.ReadNextAsync();
                   
                    response.Wait();
...
专用异步任务QueryItemsAsync2(ConnectionString ConnectionString,string sqlQueryText)
{
QueryDefinition QueryDefinition=新的QueryDefinition(sqlQueryText);
var container=cosmosClient.GetContainer(connectionString.DatabaseID,connectionString.Collection);
FeedIterator resultSet=container.GetItemQueryIterator(
查询定义,
requestOptions:new QueryRequestOptions()
{
MaxItemCount=1000,
MaxConcurrency=1
});
while(resultSet.HasMoreResults)
{
任务响应=resultSet.ReadNextAsync();
response.Wait();
...
我有两个
CosmosDB
容器,其中一个
resultSet.ReadNextAsync()
工作,第二行挂起。我认为这些容器的配置是相同的。区别在于,在一个容器上有很多数据和应用程序挂起,在第二个容器上工作,但数据很少。

您应该异步读取项,而不是通过调用
GetAwaiter().GetResult()来阻止

这样,您就不需要使用
BackgroundWorker
或涉及任何后台线程。您只需调用并等待异步
QueryItemsAsync2
方法:

var result = await QueryItemsAsync2(connectionString, queryToDownloadData.ToString());

不要使用
GetAwaiter().GetResult()
,直接等待任务。您使用的是
异步
任务
返回方法,因此应该没有问题。我也不完全清楚为什么要在
BackgroundWorker
上运行
异步
方法。您根本不需要这样做。我已经从代码中删除了异步,但应用程序仍然挂起你的应用程序挂起了吗?它挂在
QueryItemsAsync2
方法中吗?你可能会更幸运地完全
异步
,而不是尝试使用
BackgroundWorker
。使用它有什么技术要求吗?我喜欢你写的,但结果是一样的,在一个容器上它在seco上工作nd挂起
var item=wait resultSet.ReadNextAsync();
lineWhat“container”?CosmosDBit中的容器可以工作,谢谢
while (resultSet.HasMoreResults)
{
    var item = await resultSet.ReadNextAsync();
    ...
}
var result = await QueryItemsAsync2(connectionString, queryToDownloadData.ToString());