Advertisement
Guest User

Tests Async

a guest
Jul 12th, 2013
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 20.79 KB | None | 0 0
  1. using Newtonsoft.Json;
  2. using System.Collections.Concurrent;
  3. using RestAPIStoreApp.Management.Database;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Collections.ObjectModel;
  7. using System.IO;
  8. using System.Linq;
  9. using System.Net.Http;
  10. using System.Runtime.Serialization.Json;
  11. using System.Text;
  12. using System.Threading;
  13. using System.Threading.Tasks;
  14.  
  15. namespace Tests.Service
  16. {
  17.     class ServiceManager : IDisposable
  18.     {
  19.         private const int PAGINATION = 3;
  20.         private const string API_KEY = "..."; //use your custom API key here
  21.         private const string BASE_URL = "http://api.timezonedb.com/?zone={0}&format=json&key={1}";
  22.  
  23.         private DataContractJsonSerializer _serializer = new DataContractJsonSerializer(typeof(TimeModel));
  24.  
  25.         private List<TimeModel> _mainBuffer = new List<TimeModel>(PAGINATION);
  26.         private List<TimeModel> _secondaryBuffer;
  27.  
  28.         internal delegate void OnDownloadsFinishedHandler(object sender, EventArgs e);
  29.         internal event OnDownloadsFinishedHandler OnDownloadsFinished;
  30.  
  31.         private List<HttpClient> clients;
  32.  
  33.         private ServiceManager()
  34.         {
  35.             clients = new List<HttpClient>();
  36.             for (int i = 0; i < TimeZonesCount; i++)
  37.             {
  38.                 clients.Add(new HttpClient());
  39.             }
  40.         }
  41.         void IDisposable.Dispose()
  42.         {
  43.             foreach (var client in clients)
  44.                 client.Dispose();
  45.         }
  46.        
  47.         private void HandleBufferFull(List<TimeModel> localBuffer)
  48.         {
  49.             DoSomethingWithThisBuffer(localBuffer); //save to DB, display to UI, whatever... you're supposed to have an array of PAGINATION size here
  50.             localBuffer.Clear();
  51.         }
  52.         private static Mutex mutex = new Mutex();
  53.  
  54.         internal async Task StartDownloading()
  55.         {
  56.             IEnumerable<Task> tasks =Enumerable.Range(0, TimeZonesCount - 1).Select(index =>
  57.               Task.Run(async () =>
  58.               {
  59.                   var lastBatch = false;
  60.                   if (TimeZonesCount - index - 1 < PAGINATION)
  61.                   {
  62.                       lastBatch = true;
  63.                       _secondaryBuffer = new List<TimeModel>(TimeZonesCount % PAGINATION);
  64.                   }
  65.  
  66.                   List<TimeModel> localBuffer;
  67.                   bool hasMutex = false;
  68.                   if (lastBatch)
  69.                   {
  70.                       localBuffer = _secondaryBuffer;
  71.                   }
  72.                   else
  73.                   {
  74.                       localBuffer = _mainBuffer;
  75.                   }
  76.                   try
  77.                   {
  78.  
  79.                       var query = string.Format(BASE_URL, zones[index], API_KEY);
  80.  
  81.                       var response = await clients[index].GetAsync(query);
  82.                       var json = await response.Content.ReadAsStringAsync();
  83.                       TimeModel model = Deserialize(json);
  84.  
  85.                       hasMutex = mutex.WaitOne();
  86.                       if (!hasMutex)
  87.                           throw new Exception("MutexException");
  88.  
  89.                       localBuffer.Add(model);
  90.                   }
  91.                   catch (ObjectDisposedException ode)
  92.                   {
  93.                       throw;
  94.                   }
  95.                   catch (Exception e)
  96.                   {
  97.                       while (!hasMutex)
  98.                           hasMutex = mutex.WaitOne();
  99.                       TimeModel model = new TimeModel();
  100.                       model.ZoneName = zones[index];
  101.                       model.IsError = true;
  102.                       localBuffer.Add(model);
  103.                   }
  104.                   finally
  105.                   {
  106.  
  107.                       try
  108.                       {
  109.                           if (localBuffer.Count == localBuffer.Capacity && hasMutex)
  110.                           {
  111.                               HandleBufferFull(localBuffer);
  112.                           }
  113.                           if (hasMutex)
  114.                           {
  115.                               mutex.ReleaseMutex();
  116.                           }
  117.                       }
  118.                       catch (Exception finallyException)
  119.                       {
  120.                          
  121.                           throw;
  122.                       }
  123.                   }
  124.                   return 0;
  125.               }));
  126.  
  127.             try
  128.             {
  129.                 await Task.WhenAll(tasks);
  130.                
  131.                 /*
  132.                 foreach(var task in tasks)
  133.                 {
  134.                     await task;
  135.                 }
  136.                 */
  137.                
  138.                 /*
  139.                 foreach(var task in tasks)
  140.                 {
  141.                     if(task.Status != TaskStatus.RanToCompletion)
  142.                     {
  143.                         await task;
  144.                     }
  145.                 }
  146.                 */
  147.                 OnDownloadsFinished(this, new EventArgs());
  148.             }
  149.             catch (Exception e)
  150.             {
  151.                 throw;
  152.             }
  153.         }
  154.         internal TimeModel Deserialize(string json)
  155.         {
  156.             var model = JsonConvert.DeserializeObject<TimeModel>(json);
  157.             return model;
  158.         }
  159.  
  160.         internal int TimeZonesCount
  161.         {
  162.             get
  163.             {
  164.                 return zones.Length;
  165.             }
  166.         }
  167.  
  168.         #region Singleton Impl
  169.         private static ServiceManager _instance;
  170.         internal static ServiceManager Instance
  171.         {
  172.             get
  173.             {
  174.                 if (_instance == null)
  175.                     _instance = new ServiceManager();
  176.  
  177.                 return _instance;
  178.             }
  179.         }
  180.         #endregion
  181.  
  182.         #region Time Zones
  183.         private readonly string[] zones =
  184.         {
  185.             "Europe/Andorra",
  186.             "Asia/Dubai",
  187.             "Asia/Kabul",
  188.             "America/Antigua",
  189.             "America/Anguilla",
  190.             "Europe/Tirane",
  191.             "Asia/Yerevan",
  192.             "Africa/Luanda",
  193.             "Antarctica/McMurdo",
  194.             "Antarctica/South_Pole",
  195.             "Antarctica/Rothera",
  196.             "Antarctica/Palmer",
  197.             "Antarctica/Mawson",
  198.             "Antarctica/Davis",
  199.             "Antarctica/Casey",
  200.             "Antarctica/Vostok",
  201.             "Antarctica/DumontDUrville",
  202.             "Antarctica/Syowa",
  203.             "Antarctica/Macquarie",
  204.             "America/Argentina/Catamarca",
  205.             "America/Argentina/La_Rioja",
  206.             "America/Argentina/San_Juan",
  207.             "America/Argentina/Mendoza",
  208.             "America/Argentina/San_Luis",
  209.             "America/Argentina/Rio_Gallegos",
  210.             "America/Argentina/Ushuaia",
  211.             "America/Argentina/Buenos_Aires",
  212.             "America/Argentina/Cordoba",
  213.             "America/Argentina/Salta",
  214.             "America/Argentina/Jujuy",
  215.             "America/Argentina/Tucuman",
  216.             "Pacific/Pago_Pago",
  217.             "Europe/Vienna",
  218.             "Australia/Lord_Howe",
  219.             "Australia/Hobart",
  220.             "Australia/Currie",
  221.             "Australia/Melbourne",
  222.             "Australia/Sydney",
  223.             "Australia/Broken_Hill",
  224.             "Australia/Brisbane",
  225.             "Australia/Lindeman",
  226.             "Australia/Adelaide",
  227.             "Australia/Darwin",
  228.             "Australia/Perth",
  229.             "Australia/Eucla",
  230.             "America/Aruba",
  231.             "Europe/Mariehamn",
  232.             "Asia/Baku",
  233.             "Europe/Sarajevo",
  234.             "America/Barbados",
  235.             "Asia/Dhaka",
  236.             "Europe/Brussels",
  237.             "Africa/Ouagadougou",
  238.             "Europe/Sofia",
  239.             "Asia/Bahrain",
  240.             "Africa/Bujumbura",
  241.             "Africa/Porto-Novo",
  242.             "America/St_Barthelemy",
  243.             "Atlantic/Bermuda",
  244.             "Asia/Brunei",
  245.             "America/La_Paz",
  246.             "America/Kralendijk",
  247.             "America/Noronha",
  248.             "America/Belem",
  249.             "America/Fortaleza",
  250.             "America/Recife",
  251.             "America/Araguaina",
  252.             "America/Maceio",
  253.             "America/Bahia",
  254.             "America/Sao_Paulo",
  255.             "America/Campo_Grande",
  256.             "America/Cuiaba",
  257.             "America/Santarem",
  258.             "America/Porto_Velho",
  259.             "America/Boa_Vista",
  260.             "America/Manaus",
  261.             "America/Eirunepe",
  262.             "America/Rio_Branco",
  263.             "America/Nassau",
  264.             "Asia/Thimphu",
  265.             "Africa/Gaborone",
  266.             "Europe/Minsk",
  267.             "America/Belize",
  268.             "America/Blanc-Sablon",
  269.             "America/Montreal",
  270.             "America/Toronto",
  271.             "America/Nipigon",
  272.             "America/Thunder_Bay",
  273.             "America/Iqaluit",
  274.             "America/Pangnirtung",
  275.             "America/Resolute",
  276.             "America/Atikokan",
  277.             "America/Rankin_Inlet",
  278.             "America/Winnipeg",
  279.             "America/Rainy_River",
  280.             "America/Regina",
  281.             "America/Swift_Current",
  282.             "America/Edmonton",
  283.             "America/Cambridge_Bay",
  284.             "America/Yellowknife",
  285.             "America/Inuvik",
  286.             "America/Dawson_Creek",
  287.             "America/Vancouver",
  288.             "America/Whitehorse",
  289.             "America/Dawson",
  290.             "America/St_Johns",
  291.             "America/Halifax",
  292.             "America/Glace_Bay",
  293.             "America/Moncton",
  294.             "America/Goose_Bay",
  295.             "Indian/Cocos",
  296.             "Africa/Kinshasa",
  297.             "Africa/Lubumbashi",
  298.             "Africa/Bangui",
  299.             "Africa/Brazzaville",
  300.             "Europe/Zurich",
  301.             "Africa/Abidjan",
  302.             "Pacific/Rarotonga",
  303.             "America/Santiago",
  304.             "Pacific/Easter",
  305.             "Africa/Douala",
  306.             "Asia/Shanghai",
  307.             "Asia/Harbin",
  308.             "Asia/Chongqing",
  309.             "Asia/Urumqi",
  310.             "Asia/Kashgar",
  311.             "America/Bogota",
  312.             "America/Costa_Rica",
  313.             "America/Havana",
  314.             "Atlantic/Cape_Verde",
  315.             "America/Curacao",
  316.             "Indian/Christmas",
  317.             "Asia/Nicosia",
  318.             "Europe/Prague",
  319.             "Europe/Berlin",
  320.             "Africa/Djibouti",
  321.             "Europe/Copenhagen",
  322.             "America/Dominica",
  323.             "America/Santo_Domingo",
  324.             "Africa/Algiers",
  325.             "America/Guayaquil",
  326.             "Pacific/Galapagos",
  327.             "Europe/Tallinn",
  328.             "Africa/Cairo",
  329.             "Africa/El_Aaiun",
  330.             "Africa/Asmara",
  331.             "Europe/Madrid",
  332.             "Africa/Ceuta",
  333.             "Atlantic/Canary",
  334.             "Africa/Addis_Ababa",
  335.             "Europe/Helsinki",
  336.             "Pacific/Fiji",
  337.             "Atlantic/Stanley",
  338.             "Pacific/Chuuk",
  339.             "Pacific/Pohnpei",
  340.             "Pacific/Kosrae",
  341.             "Atlantic/Faroe",
  342.             "Europe/Paris",
  343.             "Africa/Libreville",
  344.             "Europe/London",
  345.             "America/Grenada",
  346.             "Asia/Tbilisi",
  347.             "America/Cayenne",
  348.             "Europe/Guernsey",
  349.             "Africa/Accra",
  350.             "Europe/Gibraltar",
  351.             "America/Godthab",
  352.             "America/Danmarkshavn",
  353.             "America/Scoresbysund",
  354.             "America/Thule",
  355.             "Africa/Banjul",
  356.             "Africa/Conakry",
  357.             "America/Guadeloupe",
  358.             "Africa/Malabo",
  359.             "Europe/Athens",
  360.             "Atlantic/South_Georgia",
  361.             "America/Guatemala",
  362.             "Pacific/Guam",
  363.             "Africa/Bissau",
  364.             "America/Guyana",
  365.             "Asia/Hong_Kong",
  366.             "America/Tegucigalpa",
  367.             "Europe/Zagreb",
  368.             "America/Port-au-Prince",
  369.             "Europe/Budapest",
  370.             "Asia/Jakarta",
  371.             "Asia/Pontianak",
  372.             "Asia/Makassar",
  373.             "Asia/Jayapura",
  374.             "Europe/Dublin",
  375.             "Asia/Jerusalem",
  376.             "Europe/Isle_of_Man",
  377.             "Asia/Kolkata",
  378.             "Indian/Chagos",
  379.             "Asia/Baghdad",
  380.             "Asia/Tehran",
  381.             "Atlantic/Reykjavik",
  382.             "Europe/Rome",
  383.             "Europe/Jersey",
  384.             "America/Jamaica",
  385.             "Asia/Amman",
  386.             "Asia/Tokyo",
  387.             "Africa/Nairobi",
  388.             "Asia/Bishkek",
  389.             "Asia/Phnom_Penh",
  390.             "Pacific/Tarawa",
  391.             "Pacific/Enderbury",
  392.             "Pacific/Kiritimati",
  393.             "Indian/Comoro",
  394.             "America/St_Kitts",
  395.             "Asia/Pyongyang",
  396.             "Asia/Seoul",
  397.             "Asia/Kuwait",
  398.             "America/Cayman",
  399.             "Asia/Aqtobe",
  400.             "Asia/Aqtau",
  401.             "Asia/Oral",
  402.             "Asia/Almaty",
  403.             "Asia/Qyzylorda",
  404.             "Asia/Vientiane",
  405.             "Asia/Beirut",
  406.             "America/St_Lucia",
  407.             "Europe/Vaduz",
  408.             "Asia/Colombo",
  409.             "Africa/Monrovia",
  410.             "Africa/Maseru",
  411.             "Europe/Vilnius",
  412.             "Europe/Luxembourg",
  413.             "Europe/Riga",
  414.             "Africa/Tripoli",
  415.             "Africa/Casablanca",
  416.             "Europe/Monaco",
  417.             "Europe/Chisinau",
  418.             "Europe/Podgorica",
  419.             "America/Marigot",
  420.             "Indian/Antananarivo",
  421.             "Pacific/Majuro",
  422.             "Pacific/Kwajalein",
  423.             "Europe/Skopje",
  424.             "Africa/Bamako",
  425.             "Asia/Rangoon",
  426.             "Asia/Ulaanbaatar",
  427.             "Asia/Hovd",
  428.             "Asia/Choibalsan",
  429.             "Asia/Macau",
  430.             "Pacific/Saipan",
  431.             "America/Martinique",
  432.             "Africa/Nouakchott",
  433.             "America/Montserrat",
  434.             "Europe/Malta",
  435.             "Indian/Mauritius",
  436.             "Indian/Maldives",
  437.             "Africa/Blantyre",
  438.             "America/Mexico_City",
  439.             "America/Cancun",
  440.             "America/Merida",
  441.             "America/Monterrey",
  442.             "America/Matamoros",
  443.             "America/Mazatlan",
  444.             "America/Chihuahua",
  445.             "America/Ojinaga",
  446.             "America/Hermosillo",
  447.             "America/Tijuana",
  448.             "America/Santa_Isabel",
  449.             "America/Bahia_Banderas",
  450.             "Asia/Kuala_Lumpur",
  451.             "Asia/Kuching",
  452.             "Africa/Maputo",
  453.             "Africa/Windhoek",
  454.             "Pacific/Noumea",
  455.             "Africa/Niamey",
  456.             "Pacific/Norfolk",
  457.             "Africa/Lagos",
  458.             "America/Managua",
  459.             "Europe/Amsterdam",
  460.             "Europe/Oslo",
  461.             "Asia/Kathmandu",
  462.             "Pacific/Nauru",
  463.             "Pacific/Niue",
  464.             "Pacific/Auckland",
  465.             "Pacific/Chatham",
  466.             "Asia/Muscat",
  467.             "America/Panama",
  468.             "America/Lima",
  469.             "Pacific/Tahiti",
  470.             "Pacific/Marquesas",
  471.             "Pacific/Gambier",
  472.             "Pacific/Port_Moresby",
  473.             "Asia/Manila",
  474.             "Asia/Karachi",
  475.             "Europe/Warsaw",
  476.             "America/Miquelon",
  477.             "Pacific/Pitcairn",
  478.             "America/Puerto_Rico",
  479.             "Asia/Gaza",
  480.             "Asia/Hebron",
  481.             "Europe/Lisbon",
  482.             "Atlantic/Madeira",
  483.             "Atlantic/Azores",
  484.             "Pacific/Palau",
  485.             "America/Asuncion",
  486.             "Asia/Qatar",
  487.             "Indian/Reunion",
  488.             "Europe/Bucharest",
  489.             "Europe/Belgrade",
  490.             "Asia/Novosibirsk",
  491.             "Asia/Novokuznetsk",
  492.             "Asia/Krasnoyarsk",
  493.             "Asia/Irkutsk",
  494.             "Asia/Yakutsk",
  495.             "Asia/Vladivostok",
  496.             "Asia/Sakhalin",
  497.             "Asia/Magadan",
  498.             "Asia/Kamchatka",
  499.             "Asia/Anadyr",
  500.             "Europe/Kaliningrad",
  501.             "Europe/Moscow",
  502.             "Europe/Volgograd",
  503.             "Europe/Samara",
  504.             "Asia/Yekaterinburg",
  505.             "Asia/Omsk",
  506.             "Africa/Kigali",
  507.             "Asia/Riyadh",
  508.             "Pacific/Guadalcanal",
  509.             "Indian/Mahe",
  510.             "Africa/Khartoum",
  511.             "Europe/Stockholm",
  512.             "Asia/Singapore",
  513.             "Atlantic/St_Helena",
  514.             "Europe/Ljubljana",
  515.             "Arctic/Longyearbyen",
  516.             "Europe/Bratislava",
  517.             "Africa/Freetown",
  518.             "Europe/San_Marino",
  519.             "Africa/Dakar",
  520.             "Africa/Mogadishu",
  521.             "America/Paramaribo",
  522.             "Africa/Juba",
  523.             "Africa/Sao_Tome",
  524.             "America/El_Salvador",
  525.             "America/Lower_Princes",
  526.             "Asia/Damascus",
  527.             "Africa/Mbabane",
  528.             "America/Grand_Turk",
  529.             "Africa/Ndjamena",
  530.             "Indian/Kerguelen",
  531.             "Africa/Lome",
  532.             "Asia/Bangkok",
  533.             "Asia/Dushanbe",
  534.             "Pacific/Fakaofo",
  535.             "Asia/Dili",
  536.             "Asia/Ashgabat",
  537.             "Africa/Tunis",
  538.             "Pacific/Tongatapu",
  539.             "Europe/Istanbul",
  540.             "America/Port_of_Spain",
  541.             "Pacific/Funafuti",
  542.             "Asia/Taipei",
  543.             "Africa/Dar_es_Salaam",
  544.             "Europe/Kiev",
  545.             "Europe/Uzhgorod",
  546.             "Europe/Zaporozhye",
  547.             "Europe/Simferopol",
  548.             "Africa/Kampala",
  549.             "Pacific/Johnston",
  550.             "Pacific/Midway",
  551.             "Pacific/Wake",
  552.             "America/Indiana/Petersburg",
  553.             "America/Indiana/Vevay",
  554.             "America/Chicago",
  555.             "America/Indiana/Tell_City",
  556.             "America/Indiana/Knox",
  557.             "America/Menominee",
  558.             "America/North_Dakota/Center",
  559.             "America/North_Dakota/New_Salem",
  560.             "America/North_Dakota/Beulah",
  561.             "America/Denver",
  562.             "America/Boise",
  563.             "America/Shiprock",
  564.             "America/Phoenix",
  565.             "America/Los_Angeles",
  566.             "America/Anchorage",
  567.             "America/Juneau",
  568.             "America/Sitka",
  569.             "America/Yakutat",
  570.             "America/Nome",
  571.             "America/Adak",
  572.             "America/Metlakatla",
  573.             "Pacific/Honolulu",
  574.             "America/New_York",
  575.             "America/Detroit",
  576.             "America/Kentucky/Louisville",
  577.             "America/Kentucky/Monticello",
  578.             "America/Indiana/Indianapolis",
  579.             "America/Indiana/Vincennes",
  580.             "America/Indiana/Winamac",
  581.             "America/Indiana/Marengo",
  582.             "America/Montevideo",
  583.             "Asia/Samarkand",
  584.             "Asia/Tashkent",
  585.             "Europe/Vatican",
  586.             "America/St_Vincent",
  587.             "America/Caracas",
  588.             "America/Tortola",
  589.             "America/St_Thomas",
  590.             "Asia/Ho_Chi_Minh",
  591.             "Pacific/Efate",
  592.             "Pacific/Wallis",
  593.             "Pacific/Apia",
  594.             "Asia/Aden",
  595.             "Indian/Mayotte",
  596.             "Africa/Johannesburg",
  597.             "Africa/Lusaka",
  598.             "Africa/Harare"
  599.         };
  600.         #endregion
  601.     }
  602.    
  603.     [DataContract]
  604.     public class TimeModel : IComparable<TimeModel>
  605.     {
  606.         public TimeModel()
  607.         {
  608.         }
  609.         [DataMember]
  610.         public string CountryCode { get; set; }
  611.         [DataMember]
  612.         public string ZoneName { get; set; }
  613.         [DataMember]
  614.         public string Abbreviation { get; set; }
  615.         [DataMember]
  616.         public int GMTOffset { get; set; }
  617.         [DataMember]
  618.         public bool DaylightSaving { get; set; }
  619.         [DataMember]
  620.         public double TimeStamp { get; set; }
  621.        
  622.         public bool IsError { get; set; }
  623.  
  624.         public override bool Equals(object obj)
  625.         {
  626.             if (obj == null)
  627.                 return false;
  628.             TimeModel other = obj as TimeModel;
  629.             if (other == null)
  630.                 return false;
  631.  
  632.             return  this.CountryCode        == other.CountryCode        &&
  633.                     this.ZoneName           == other.ZoneName           &&
  634.                     this.Abbreviation       == other.Abbreviation       &&
  635.                     this.GMTOffset          == other.GMTOffset          &&
  636.                     this.DaylightSaving     == other.DaylightSaving     &&
  637.                     this.TimeStamp          == other.TimeStamp;
  638.         }
  639.  
  640.         public override int GetHashCode()
  641.         {
  642.             unchecked
  643.             {
  644.                 int hash = 17;
  645.                 int salt = 29;
  646.  
  647.                 hash = hash * salt + this.CountryCode.GetHashCode();
  648.                 hash = hash * salt + this.ZoneName.GetHashCode();
  649.                 hash = hash * salt + this.Abbreviation.GetHashCode();
  650.                 hash = hash * salt + this.GMTOffset.GetHashCode();
  651.                 hash = hash * salt + this.DaylightSaving.GetHashCode();
  652.                 hash = hash * salt + this.TimeStamp.GetHashCode();
  653.  
  654.                 return hash;
  655.             }
  656.         }
  657.  
  658.         int IComparable<TimeModel>.CompareTo(TimeModel other)
  659.         {
  660.             return this.ZoneName.CompareTo(other.ZoneName);
  661.         }
  662.     }
  663. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement