2013-12-10 4 views
0

Мне нужно создать метод, который объединит несколько Xelements в один. Я создал ниже метод:Один XElement из нескольких потоков

 static void DoStuff(string IP, string login, string password, string port) 
     { 
      CommonMethods cm = new CommonMethods();    
      WebClient webClient = new WebClient(); 
      XElement output = null; 

      try 
      { 
       webClient = cm.ConnectCiscoUnityServerWebClient(IP, login, password); 
       int rowsPerPage = 100; 
       int pageNumber = 1; 
       Console.WriteLine("Getting logins from " + IP); 

       do 
       { 
        Console.WriteLine("Downloading " + pageNumber + " page"); 
        string uri = @"https://" + IP + ":" + port + "/vmrest/users?bla&rowsPerPage=" + rowsPerPage + "&pageNumber=" + pageNumber; 
        Stream stream = webClient.OpenRead(uri); 
        output = XElement.Load(stream);      
        pageNumber++; 
       } 
       while (output.HasElements); 

       Console.WriteLine(output); 
      } 
      catch (Exception ex) 
      { 
       cm.LogErrors(ex.ToString(), System.Reflection.MethodBase.GetCurrentMethod().Name.ToString()); 
      } 
     } 

, но в то время как цикл Do выход перезаписаны. Не могли бы вы предоставить мне какое-то решение, которое объединит вывод в один?

ответ

1

На каждой итерации вы являетесь основным элементом output. Вместо того, чтобы создать в результате элемент и добавлять новые элементы к ним на каждой итерации:

CommonMethods cm = new CommonMethods();    
WebClient webClient = new WebClient(); 
XElement output = null; 

try 
{ 
    webClient = cm.ConnectCiscoUnityServerWebClient(IP, login, password); 
    int rowsPerPage = 100; 
    int pageNumber = 1; 
    Console.WriteLine("Getting logins from " + IP); 
    XElement result = new XElement("result"); // will hold results 

    do 
    { 
     Console.WriteLine("Downloading " + pageNumber + " page"); 
     string uri = @"https://" + IP + ":" + port + 
      "/vmrest/users?bla&rowsPerPage=" + 
      rowsPerPage + "&pageNumber=" + pageNumber; 

     Stream stream = webClient.OpenRead(uri); 
     output = XElement.Load(stream); 
     result.Add(output); // add current output to results 
     pageNumber++; 
    } 
    while (output.HasElements); 

    Console.WriteLine(result); 
} 
catch (Exception ex) 
{ 
    cm.LogErrors(ex.ToString(), MethodBase.GetCurrentMethod().Name.ToString()); 
} 

Результирующий элемент может быть первый нагруженных output элементов. Затем вы можете делать некоторые запросы к следующим элементам и добавлять результаты к результирующему элементу. Трудно сказать больше, не видя данных, с которыми вы работаете.

Смежные вопросы