public async Task <ResultsLoadBankData[]> LoadAndSave()
        {
            var items = providers.Banks().Select(it =>
                                                 new KeyValuePair <string, ResultsLoadBankData>(it,
                                                                                                new ResultsLoadBankData()
            {
                Bank            = it,
                ErrorMessage    = "error loading",
                HasSuccess      = false,
                NrRecordsSaved  = 0,
                NrRecordsLoaded = -1
            })
                                                 );;
            var lst = new Dictionary <string, ResultsLoadBankData>(items);


            var rates =
                providers.LoadExchange()
                .Select(it => it.GetActualRates())
                .ToArray();
            //TODO: how to load async all async enumerables?
            //TODO: how to report error if one fails?
            var allRates = new List <ExchangeRates>();

            foreach (var rateAsync in rates)
            {
                try
                {
                    var ratesBank = await rateAsync;
                    allRates.AddRange(ratesBank);
                }
                catch (Exception)
                {
                }
            }
            var groups = allRates.GroupBy(it => it.Bank).ToDictionary(it => it.Key, it => it.ToArray());

            foreach (var bank in groups.Keys)
            {
                var item = lst[bank];
                item.HasSuccess      = true;
                item.ErrorMessage    = null;
                item.NrRecordsLoaded = groups[bank].Length;
                item.NrRecordsSaved  = 0;
                foreach (var rate in groups[bank])
                {
                    try
                    {
                        if (await ret.Exists(rate))
                        {
                            continue;
                        }
                        var nr = await save.Save(rate);

                        item.NrRecordsSaved++;
                    }
                    catch (Exception ex)
                    {
                        //TODO:log
                        item.ErrorMessage = ex.Message;
                        item.HasSuccess   = false;
                    }
                }
            }


            return(lst.Values.ToArray());
        }
示例#2
0
 public IEnumerable <string> Banks()
 {
     return(_prov.Banks());
 }