2013-11-08 4 views
-3

Я пытаюсь составить список рейсов, которые ищут в различных веб-сервисах, и возвращается для необычных рейсов. Я создал TASK и желаю, чтобы кто-то подтвердил и дал мне советы по улучшению.Подтвердить выполнение задания C#

Задача ждет до 30 секунд. Если что-то ocorer на некоторых веб-сервисах я хочу вернуть, даже если он дает ошибку.

Пожалуйста, смотрите код и оценить:

Задача, возвращающие рейсы

public List<datatypes.ResponseAvail> SearchRQWithTask(datatypes.RequestAvail rq) 
    { 

     List<datatypes.ResponseAvail> rsLst = new List<datatypes.ResponseAvail>(); 
     try 
     { 
      var tasks = new List<Task>(); 

      foreach (var broker in rq.brokers) 
      { 
       switch (broker.NomeBroker) 
       { 
        case Brokers.Azul: 
         brokers.Azul az = new brokers.Azul(); 
         tasks.Add(Task.Factory.StartNew(() => rsLst.Add(az.SearchAzul(rq)))); 
         break; 
        case Brokers.Sabre: 
         brokers.Sabre sabre = new brokers.Sabre(); 
         tasks.Add(Task.Factory.StartNew(() => rsLst.Add(sabre.SearchSabre(rq)))); 
         break; 
        case Brokers.TAM: 
         brokers.TAM tam = new brokers.TAM(); 
         tasks.Add(Task.Factory.StartNew(() => rsLst.Add(tam.SearchTAM(rq)))); 
         break; 
        default: 
         break; 
       } 
      } 
      Task.WaitAll(tasks.ToArray(), 10000); 
     } 
     catch (Exception ex) 
     {     
      rsLst[0].Error = ex; 
     } 

     return rsLst; 
    } 

Запрос Свободна

public class RequestAvail 
{ 

    public int idClienteRq { get; set; }  
    public List<BrokersList> brokers { get; set; } 
    public string origem { get; set; } 
    public string destino { get; set; } 
} 
public class BrokersList 
{ 
    public int id { get; set; } 
    public Brokers NomeBroker { get; set; } 
} 

public enum Brokers 
{ 
    Azul = 1, 
    Sabre = 2, 
    GOL = 3, 
    TAM = 4    
}  

responseAvail

public class ResponseAvail : Exception 
{ 
    public int code { get; set; } 
    public string brokerName { get; set; } 
    public List<ListVoos> voos { get; set; } 
    public Exception Error { get; set; } 
} 
public class ListVoos 
{ 
    public int id { get; set; } 
    public string ori { get; set; } 
    public string des { get; set; } 
    public DateTime departure { get; set; } 
    public DateTime arrival { get; set; } 

} 

Брокеры, которые я выполняю из веб-сервисов, звонят. Это поддельное возвращение.

class Azul 
{   
    public datatypes.ResponseAvail SearchAzul(datatypes.RequestAvail rq) 
    { 
     datatypes.ResponseAvail rs = new datatypes.ResponseAvail(); 
     rs.brokerName = "AZUL"; 
     rs.code = 100; 
     rs.voos = new List<datatypes.ListVoos>(); 
     rs.voos.Add(new datatypes.ListVoos{ 
      arrival = new DateTime(2013,05,10), 
      departure = new DateTime(2013,05,10), 
      id = 1, 
      ori="SAO", 
      des="GIG"    
     }); 

     return rs; 
    } 


} 

Saber Брокер

public class Sabre 
{ 
    public datatypes.ResponseAvail SearchSabre(datatypes.RequestAvail rq) 
    { 
     datatypes.ResponseAvail rs = new datatypes.ResponseAvail(); 

     try 
     { 

     rs.brokerName = "Sabre"; 
     rs.code = 5665; 
     rs.voos = new List<datatypes.ListVoos>(); 
     rs.voos.Add(new datatypes.ListVoos 
     { 
      arrival = new DateTime(2013, 05, 10), 
      departure = new DateTime(2013, 05, 10), 
      id = 1, 
      ori = "SAO", 
      des = "GIG" 
     }); 

     Thread.Sleep(100); 
     // 
     //if (rs.voos[0].ori == "SAO") 
     //{ 
     // throw new Exception("Erro no source Sabre...."); 

     //} 

     } 
     catch (Exception ex) 
     { 
      throw ex; 
     }    

     return rs; 
    } 

} 

Tam Брокер поддельной

public class TAM 
{ 
    public datatypes.ResponseAvail SearchTAM(datatypes.RequestAvail rq) 
    { 
     datatypes.ResponseAvail rs = new datatypes.ResponseAvail(); 
     rs.brokerName = "TAM"; 
     rs.code = 300; 
     rs.voos = new List<datatypes.ListVoos>(); 
     rs.voos.Add(new datatypes.ListVoos 
     { 
      arrival = new DateTime(2013, 05, 10), 
      departure = new DateTime(2013, 05, 10), 
      id = 1, 
      ori = "SAO", 
      des = "GIG" 
     }); 

     return rs; 
    } 

} 
+5

Итак, ваш вопрос, пожалуйста, просмотрите этот код для меня? codereview.stackexchange.com работает для этого. – paqogomez

+0

Возможно, вы попытались решить эту проблему самостоятельно. – gleng

ответ

0

Это не обязательно будет работать правильно.

Прямо сейчас вы используете List<T>, чтобы сохранить свои результаты, но используя ThreadPool через Task.Factory.StartNew, чтобы сгенерировать их. Это не будет потокобезопасным, что может вызвать проблемы, если результаты возвращаются в одно и то же время.

При этом этот код, в общем, выиграет от использования новых функций языка async и await и выполнения операций как операций async. Это позволит избежать использования пула потоков полностью, что обеспечит гораздо большую масштабируемость.

+0

Привет, Рид, Так какой лучший подход? Этот код используется для возврата всех полетов до 30 секунд. Я хотел бы получить поток safe nad Если возникла ошибка, я сохраню сообщение. Это приложение используется одним веб-сайтом. пс. Я отправляю одну почту в ваш блог с тем же вопросом. –

+0

@Rodrigo Как я уже сказал, изучите использование async и ждите - это будет намного лучше, более чистый подход и в этом случае избежать проблем синхронизации потоков. –

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