2016-02-04 8 views
0

Я использую код C# для отправки Xml в конечную точку api и захвата ответа Как я это делаю У меня есть папка A со 100 xmls, папка B со 100 Xmls и папка C со 100 xmlsC# - Task.WaitAll() не ждет завершения всей задачи

Я прокручиваю каждую из папок и в каждой итерации цикла создаю задачу. Позволяет называть это как задачу папки

Задача папки перемещается по всему xml в каждой папке и фиксирует ответ. Это выполняется в методе sendrequestandcaptureresponse()

Проблема, с которой я сталкиваюсь, представляет собой конец цикла перед обработкой всех xmls. Метод sendrequestandcaptureresponse() запускается для всех 300 XMLS (который находится в папке A, B и C), но я получаю ответ только за 150 (приблизительно) XMLS

Task.WaitAll (tasklist) завершает работу перед ожиданием всех XML-запросов ответы

Вы можете найти код ниже

кодекса перебрать папку

foreach(Folder in Folders){ 

      Task t=Task.Factory.StartNew(
       async() => 
          {         
           Httpmode.RunRegressionInHTTPMode(folderPath);           
          } 
         }).Unwrap();      
       tasklist.Add(t); 

     }   
Task.WaitAll(tasklist.ToArray()); 

код, который отправляет запрос и улавливает г esponse

public void RunRegressionInHTTPMode(folderPath){ 


     try 
     { 
      string directoryPath = CurrServiceSetting.GetDirectoryPath(); 
      var filePaths = CreateBlockingCollection(folderPath+"\\Input\\");     
      int taskCount = Int32.Parse(CurrServiceSetting.GetThreadCount()); 

      var tasklist = new List<Task>(); 
      for (int i = 0; i < taskCount; i++) 
      { 
       var t=Task.Factory.StartNew(
          async () => 
          { 
          string fileName; 
          while (!filePaths.IsCompleted) 
          { 
           if (!filePaths.TryTake(out fileName)) 
            {          
             continue; 
            } 

           try{ 
            SendRequestAndCaptureResponse(fileName,CurrServiceSetting,CurrSQASettings,testreportlocationpath);           
           } 
           catch(Exception r) 
           { 
            Console.WriteLine("#####SOME Exception in SendRequestAndCaptureResponse "+r.Message.ToString());           
           } 
          } 
         }).Unwrap(); 
       tasklist.Add(t); 
      }     
      Task.WaitAll(tasklist.ToArray());     
     } 
     catch(Exception e) 
     { 

     } 
    } 

Может ли кто-нибудь указать мне, что мне не хватает здесь. Я поставил задачу как задачу async и добавил метод Unwrap в конце задачи, но все еще не смог дождаться завершения всей задачи.

Любая помощь будет отличной.

Заранее спасибо

Добавление кода SendRequestAndCaptureResponse ниже

public void SendRequestAndCaptureResponse(string fileName,ServiceSettings curServiceSettings,SQASettings CurrSQASettings,string testreportlocationpath){    
     XmlDocument inputxmldoc = new XmlDocument ();    

     Stream requestStream=null; 
     byte[] bytes; 
     DateTime requestsenttime=DateTime.Now; 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create (url); 
     string responseStr = ""; 

     bytes = Encoding.ASCII.GetBytes (str4); 
     try{ 
      request.ContentType = "text/xml; encoding='utf-8'"; 
      request.ContentLength = bytes.Length; 
      Credentials credentials = new Credentials();   
      request.Credentials = new NetworkCredential (CurrSQASettings.GetUserName(), CurrSQASettings.GetPassword()); 
      request.Method = "POST"; 
      request.Timeout = Int32.Parse(curServiceSettings.GetTimeOut()); 
      //OVERRIDING TIME 
      requestsenttime=DateTime.Now; 
      requestStream = request.GetRequestStream ();   
      requestStream.Write (bytes, 0, bytes.Length);   
      requestStream.Close (); 
     } 
     catch(Exception e){ 
      return; 
     } 



     HttpWebResponse response; 
     try 
     { 
     response = (HttpWebResponse)request.GetResponse (); 
     if (response.StatusCode == HttpStatusCode.OK) 
     {   


     allgood = true; 
     Stream responseStream = response.GetResponseStream (); 
     responseStr = new StreamReader (responseStream).ReadToEnd (); 
     XmlDocument xml = new XmlDocument (); 
     xml.LoadXml (responseStr);  
     xml.Save(resultantactualxmlpath);   
     response.Close(); 
     responseStream.Close();   

     } 

     } 
     catch(Exception e){ 
      return; 
     } 

} 
+0

спасибо Glorin. В этом случае, пожалуйста, сообщите, какую возвращаемую стоимость он ожидает. Любые указатели будут полезны. –

+1

Не ожидайте методов/делегатов void: https://msdn.microsoft.com/en-us/magazine/jj991977.aspx –

+0

Что произойдет, если вы выбросите; вместо возврата; в этой последней функции вы добавили? Мне кажется, вы скрываете потенциальные ошибки. –

ответ

1

Вы не ждут внутренней задачи:

foreach(Folder in Folders){ 

      Task t=Task.Factory.StartNew(
       async() => 
          {         
           await Httpmode.RunRegressionInHTTPMode(folderPath); // <--- await here           
          } 
         }).Unwrap();      
       tasklist.Add(t); 

     }   
Task.WaitAll(tasklist.ToArray()); 

НИХ, ваши итерации не ждет внутренний Задачи для завершения - на каждой итерации вы просто создаете задачу и перемещаетесь.

Более изящный способ создания задачи будет:

var tasks = Folders.Select(p=> Httpmode.RunRegressionInHTTPMode(p)).ToArray(); 
Task.WaitAll(tasks); 

(опечатка нечувствительны)

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