-3

さまざまな Web サービスで検索し、通常とは異なるフライトを返すフライトのリストを作成しようとしています。TASK を作成しました。誰かに検証してもらい、改善するためのヒントを教えてもらいたいです。

タスクは最大 30 秒待機します。エラーが発生しても、一部のWebサービスで何かが発生した場合は、返したいと思います。

コードを見て評価してください:

フライトを返すタスク

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             
}      

レスポンスAvail

 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; }

}

Web サービス呼び出しから実行するブローカー。これは偽の返品です。

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;
    }


}

セイバーブローカー

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;
    }

}

タムブローカーの偽物

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;
    }

}
4

1 に答える 1

0

これは必ずしも正しく動作するとは限りません。

現在、List<T>結果を保存するために を使用していますが、生成には ThreadPool 経由Task.Factory.StartNewを使用しています。これはスレッドセーフではないため、結果が同時に返されると問題が発生する可能性があります。

そうは言っても、一般に、このコードは、新しい機能asyncawait言語機能を使用し、操作を非同期操作として実行することでメリットが得られます。これにより、スレッド プールを完全に使用する必要がなくなり、スケーラビリティが大幅に向上します。

于 2013-11-08T20:17:03.113 に答える