Пример #1
0
        /// <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());
        }
Пример #2
0
        /// <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;
            }
        }