Asynchronous 有没有办法异步处理多个xml提要?
我使用Atom10FeedFormatter类来处理调用ODataRESTAPI端点的AtomXML提要 它工作得很好,但是如果提要中有200多个条目,那么api给出的结果很慢 这就是我使用的:Asynchronous 有没有办法异步处理多个xml提要?,asynchronous,task,odata,xmlreader,atom-feed,Asynchronous,Task,Odata,Xmlreader,Atom Feed,我使用Atom10FeedFormatter类来处理调用ODataRESTAPI端点的AtomXML提要 它工作得很好,但是如果提要中有200多个条目,那么api给出的结果很慢 这就是我使用的: Atom10FeedFormatter formatter = new Atom10FeedFormatter(); XNamespace d = "http://schemas.microsoft.com/ado/2007/08/dataservices";
Atom10FeedFormatter formatter = new Atom10FeedFormatter();
XNamespace d = "http://schemas.microsoft.com/ado/2007/08/dataservices";
string odataurl= "http://{mysite}/_api/ProjectData/Projects";
using (XmlReader reader = XmlReader.Create(odataurl))
{
formatter.ReadFrom(reader);
}
foreach (SyndicationItem item in formatter.Feed.Items)
{
//processing the result
}
我希望通过拆分原始请求来查询结果,跳过一些条目并限制条目大小,从而使这个过程至少加快一点
其主要思想是使用$count计算提要的数量,将提要结果分成20个块,在端点url中使用$skip和$top,迭代结果,最后汇总它们
int countoffeeds = 500; // for the sake of simplicity, of course, i get it from the odataurl using $count
int numberofblocks = (countoffeeds/20) + 1;
for(int i = 0; i++; i<numberofblocks){
int skip = i*20;
int top = 20;
string odataurl = "http://{mysite}/_api/ProjectData/Projects"+"?&$skip="+skip+"&top=20";
Atom10FeedFormatter formatter = new Atom10FeedFormatter();
using (XmlReader reader = XmlReader.Create(odataurl))
{
formatter.ReadFrom(reader); // And this the part where I am stuck. It returns a void so I
//cannot use Task<void> and process the result later with await
}
...
int countoffeeds=500;//当然,为了简单起见,我使用$count从odataurl获得它
int numberofblocks=(countoffeeds/20)+1;
对于(int i=0;i++;i
通常我会使用对api的异步调用(本例中numberofblocks=26个并行调用),但我不知道该怎么做。formatter.ReadFrom返回void,因此我不能将其用于任务
Atom10FeedFormatter
目前是一种非常过时的类型,它不支持异步。它也不可能更新为支持异步
如何解决这个问题,如何同时读取多个xml提要
由于您被困在同步世界中,因此您可以选择使用“伪异步”。这只意味着您将在线程池线程上执行同步阻塞工作,并将这些操作视为异步操作。例如:
var tasks = new List<Task<Atom10FeedFormatter>>();
for(int i = 0; i++; i<numberofblocks) {
int skip = i*20;
int top = 20;
tasks.Add(Task.Run(() =>
{
string odataurl = "http://{mysite}/_api/ProjectData/Projects"+"?&$skip="+skip+"&top=20";
Atom10FeedFormatter formatter = new Atom10FeedFormatter();
using (XmlReader reader = XmlReader.Create(odataurl))
{
formatter.ReadFrom(reader);
return formatter;
}
}));
}
var formatters = await Task.WhenAll(tasks);
var tasks=newlist();
对于(int i=0;i++;i
{
字符串odataurl=“http://{mysite}/_-api/ProjectData/Projects”+“?&$skip=“+skip+”&top=20”;
Atom10FeedFormatter formatter=新的Atom10FeedFormatter();
使用(XmlReader=XmlReader.Create(odataurl))
{
格式化程序ReadFrom(reader);
返回格式化程序;
}
}));
}
var formatters=wait Task.WhenAll(任务);
谢谢,我会试试看。:)成功了!此外,我在for循环中的代码中犯了一个错误。再次感谢你!