/// <summary> /// Загрузить данные по акциям /// </summary> /// <param name="lst">Список акций</param> /// <param name="lbl">Лейбл с формы</param> /// <param name="bar">Прогресс-бар</param> /// <returns></returns> public static async Task LoadStocksData(List <Stock> lst, IReportText lbl, IReportProgress bar) { int count = lst.Count, doneEvents = 0; var report = new StringBuilder(); Task[] tasks = new Task[count]; Stopwatch stwatch = Stopwatch.StartNew(); for (int i = 0; i < lst.Count; i++) { var i1 = i; tasks[i] = Task.Run(async() => { try { await GetStockData(lst[i1]); } catch (Exception er) { Logger.Log.Error( $"Не удалось получить инфу по {lst[i1].Name}: {er.Message}\r\n{er.StackTrace}"); report.Append($"{lst[i1].Name};"); } Interlocked.Increment(ref doneEvents); if (i1 % 10 != 0) { return; } if (lbl != null) { double mins = stwatch.Elapsed.TotalSeconds * (1.0 / ((double)doneEvents / count) - 1) / 60.0; mins = Math.Floor(mins) + (mins - Math.Floor(mins)) * 0.6; lbl.Text = $@"Обработано {doneEvents} / {count}. Расчетное время: { (mins >= 1 ? Math.Floor(mins) + " мин " : "") }{Math.Floor((mins - Math.Floor(mins)) * 100)} с" ; } if (bar != null) { bar.Value = doneEvents * 100 / count; } }); } await Task.WhenAll(tasks); stwatch.Stop(); if (bar != null) { bar.Value = 100; } if (lbl != null) { lbl.Text = @"Готово."; } MakeReportAndSaveToFile(lst, report.ToString()); }
/// <summary> /// Загрузить список всех акций /// </summary> public static async Task GetStocksList(IReportText lbl, IReportProgress bar, bool loadAllStocksAgain = true) { Stocks.Clear(); try { if (loadAllStocksAgain) { var getRus = Task.Run(GetRussianStocks); var getUsa = Task.Run((Action)GetUsaStocks); await Task.WhenAll(getRus, getUsa); CheckForRepeatsAndSort(); } int count = Stocks.Count; s_doneEventsCount = 0; Stopwatch stwatch = Stopwatch.StartNew(); var tinkoffCheck = Task.Run(async() => await CheckAllForTinkoff(count)); while (true) { double mins = stwatch.Elapsed.TotalSeconds * (1.0 / ((double)s_doneEventsCount / count) - 1) / 60.0; mins = Math.Floor(mins) + (mins - Math.Floor(mins)) * 0.6; if (lbl != null) { lbl.Text = $@"Обработано {s_doneEventsCount} / {count}. Расчетное время: { (mins >= 1 ? Math.Floor(mins) + " мин " : "") }{Math.Floor((mins - Math.Floor(mins)) * 100)} с" ; } if (bar != null) { bar.Value = s_doneEventsCount * 100 / count; } if (tinkoffCheck.IsCompleted) { break; } await Task.Delay(5 * 1000); if (tinkoffCheck.IsCanceled || tinkoffCheck.IsFaulted) { break; } } } catch (Exception ex) { Logger.Log.Error(ex); throw; } }