Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.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
Asynchronous 有没有办法异步处理多个xml提要?_Asynchronous_Task_Odata_Xmlreader_Atom Feed - Fatal编程技术网

Asynchronous 有没有办法异步处理多个xml提要?

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类来处理调用ODataRESTAPI端点的AtomXML提要

它工作得很好,但是如果提要中有200多个条目,那么api给出的结果很慢

这就是我使用的:

        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循环中的代码中犯了一个错误。再次感谢你!