C# 分页图数据

C# 分页图数据,c#,microsoft-graph-api,microsoft-graph-sdks,C#,Microsoft Graph Api,Microsoft Graph Sdks,我已经检查了堆栈上的多个分页线程,但无法生成代码的功能副本 我知道在下面的例子中,Graph每页返回200个项目,如果我想查看所有项目,我需要切换到下一页。请检查以下代码,并告诉我我做错了什么 始终在调用NextPageRequest.GetAsync的捕获中引发异常 该代码的结果是仅删除了200个3xx项 var deleteListItems=新列表; var deleteListItemsPage=await graphServiceClient .Sites[siteUrl] .列表[列

我已经检查了堆栈上的多个分页线程,但无法生成代码的功能副本

我知道在下面的例子中,Graph每页返回200个项目,如果我想查看所有项目,我需要切换到下一页。请检查以下代码,并告诉我我做错了什么

始终在调用NextPageRequest.GetAsync的捕获中引发异常

该代码的结果是仅删除了200个3xx项

var deleteListItems=新列表; var deleteListItemsPage=await graphServiceClient .Sites[siteUrl] .列表[列表名] .项目 .RequestdeleteQueryOptions .GetAsync; deleteListItems.AddRangedeleteListItemsPage.CurrentPage; 做 { deleteListItemsPage中的foreach变量deleteItem { awaitTasks.AddgraphServiceClient .Sites[siteUrl] .列表[列表名] .Items[deleteItem.Id] 要求 .DeleteAsync; } 尝试 { Task.WaitAllawaitTasks.ToArray; } 接住 { Console.WriteLineERROOR执行任务; } Console.WriteLinean成功删除列表项的其他页面; 尝试 { deleteListItemsPage=等待deleteListItemsPage.NextPageRequest.GetAsync; deleteListItems.AddRangedeleteListItemsPage.CurrentPage; } 接住 { Console.WriteLine不是删除项目的下一个请求,或发生错误。; } }而deleteListItemsPage.NextPageRequest!=无效的 一些意见:

Task.WaitAll模式在技术上是正确的,但在实践中,它容易出现人为错误。您应该始终使用async/await模式,除非有非常令人信服的技术原因,否则应该使用async/await模式。这会帮你省去很多麻烦

除非您不希望在没有警告或上下文FTR的情况下使用任何异常,否则永远不应该使用空的catch{}子句。至少,您应该捕获泛型System.Exception并将其分配给变量catch Exception e{},即使您对它执行的唯一操作是将异常记录到控制台catch Exception e{console.WriteLinee;}

当您知道某个对象可能为null时,应该始终检查null,而不是依赖Try/Catch。Try/Catch模式依赖于异常,这比简单的空检查要昂贵得多

对于这样的场景,更好的模式应该是这样的:

专用异步任务删除项 { //构造HTTP请求,但暂时不要执行它 var deleteListItemsRequest=graphServiceClient .Sites[siteUrl] .列表[列表名] .项目 .请求删除查询选项; //此循环用于在页面上进行迭代 做 { //通过执行HTTP请求填充页面 var deleteListItemsPage=deleteListItemsRequest.GetAsync; //迭代当前页面 deleteListItemsPage.CurrentPage中的foreach var listItem { //执行delete并等待响应 等待图形服务客户端 .Sites[siteUrl] .列表[列表名] .Items[deleteItem.Id] 要求 .DeleteAsync; } //检查是否有其他页面 如果deleteListItemsPage.NextPageRequest!=null { //如果我们有一个附加页面,请将其分配给 //相同的HTTP请求对象。同样,我们不执行 //然而,它将在循环的顶部执行 deleteListItemsRequest=deleteListItemsPage.NextPageRequest; } 其他的 { //如果没有其他页面,请将 //请求为null,以便我们可以使用它触发退出 //从循环 deleteListItemsRequest=null; } //检查是否有图形请求,如果没有,则中断循环 }而deleteListItemsRequest!=null; }
根据skipToken的工作方式,删除第一页中的所有项目可能会使skipToken无效。我建议遍历所有页面,收集ID,然后遍历ID列表并将其全部删除。在另一个问题中,我建议对请求进行并行化,因为问题是删除所有项目花费的时间太长。并行发出deletes命令可以消除大量等待。我同意处理Task.WaitAll可能很棘手,尤其是处理失败。我认为DeleteListItems列表没有问题,因为他正在迭代的不是这个列表。我怀疑他只是在跟踪所有被删除的项目。Marc,谢谢你的建议和帮助,我真的很感激:-你的代码工作得很好,但是它逐个删除1的方式需要很长时间。我已将其调整为使用任务。WaitAl
即使你不推荐它,而且它似乎工作得又好又快。我会记住它,并观察它的行为一点。并行性没有问题,只要你减少潜在的节流,调试线性流就更容易了,所以我通常建议从这里开始。规模绝对是这样做的一个有效的技术原因。