Exemple #1
0
        /// <summary>
        /// Асинхронная загрузка исторических данных по фин. инструменту
        /// </summary>
        /// <param name="insStore">Поток данных</param>
        /// <param name="date1">Начальная дата</param>
        /// <param name="date2">Конечная дата</param>
        /// <param name="isLastDirty">Последняя дата содердит неполные данные</param>
        /// <param name="isForward">Загрузка блоками от начальной даты к конечной (иначе от конечной к начальной)</param>
        /// <param name="progress">Объект управления фоновой задачей</param>
        /// <param name="cancel">Объект отмены длительной операции</param>
        /// <returns>Асинхронная задача загрузки</returns>
        public async Task DownloadAsync(CommonData.InsStore insStore, DateTime date1, DateTime date2, bool isLastDirty, bool isForward,
                                        BgTaskProgress progress, CancellationToken cancel)
        {
            try
            {
                var parts = GetDownloadParts(insStore.Tf, date1, date2, isForward);
                int idx = 1; int count = parts.Count();
                if (progress != null)
                {
                    progress.OnStart(count > 1);
                }

                foreach (var part in parts)
                {
                    if (cancel.IsCancellationRequested)
                    {
                        if (progress != null)
                        {
                            progress.OnAbort();
                        }
                        break;
                    }
                    await SyncDataBlock(insStore, part.Date1, part.Date2, isLastDirty, cancel);

                    if (progress != null)
                    {
                        progress.OnProgress((double)idx++ / count * 100);
                    }
                }
                if (progress != null)
                {
                    if (cancel.IsCancellationRequested)
                    {
                        progress.OnAbort();
                    }
                    else
                    {
                        progress.OnComplete();
                    }
                }
            }
            catch (Exception ex)
            {
                if (progress != null)
                {
                    progress.OnFault(ex);
                }
            }
        }
Exemple #2
0
        /// <summary>
        /// Асинхронная загрузка исторических данных
        /// </summary>
        /// <param name="toDate">Загрузка по эту дату включительно</param>
        /// <param name="isLastDirty">Данные за последний день неполные</param>
        /// <param name="progress">Объект управления фоновой задачей</param>
        /// <param name="cancel">Отмена длительной операции</param>
        /// <returns>Асинхронная задача загрузки</returns>
        public Task DownloadAllAsync(DateTime toDate, bool isLastDirty, BgTaskProgress progress, CancellationToken cancel)
        {
            return(Task.Run(() =>
            {
                try
                {
                    _logger.LogInformation("DownloadAll to {date}", toDate.ToString("yyyy-MM-dd"));

                    var insStores = _insStoreBL.GetActiveInsStores();
                    int count = insStores.Count(); int idx = 1;
                    if (progress != null)
                    {
                        progress.OnStart(count > 1);
                    }
                    Dictionary <CommonData.InsStore, BgTaskProgress> progresses = new Dictionary <CommonData.InsStore, BgTaskProgress>();
                    if (progress != null)
                    {
                        foreach (var ss in insStores)
                        {
                            string name = "";
                            var instrum = _instrumBL.GetInstrumByID(ss.InsID);
                            if (instrum != null)
                            {
                                name = instrum.ShortName;
                            }
                            var child = progress.AddChildProgress(name);
                            progresses.Add(ss, child);
                        }
                    }

                    foreach (var insStore in insStores)
                    {
                        if (cancel.IsCancellationRequested)
                        {
                            if (progress != null)
                            {
                                progress.OnAbort();
                            }
                            break;
                        }

                        var ssCal = _insStoreBL.GetInsStoreCalendar(insStore.InsStoreID);
                        if (ssCal == null || ssCal.Periods == null)
                        {
                            continue;
                        }

                        DateTime fromDate;
                        if (ssCal.Periods.Count() > 0)
                        {
                            var lastPeriod = ssCal.Periods.Last();
                            fromDate = lastPeriod.IsLastDirty ? lastPeriod.EndDate : lastPeriod.EndDate.AddDays(1);
                        }
                        else
                        {
                            fromDate = _insStoreBL.GetDefaultStartHistoryDate(toDate, insStore.Tf);
                        }

                        var p = progresses.ContainsKey(insStore) ? progresses[insStore] : null;
                        DownloadAsync(insStore, fromDate, toDate, isLastDirty, true, p, cancel).Wait();
                        if (progress != null)
                        {
                            progress.OnProgress((double)idx++ / count * 100);
                        }
                    }
                    if (progress != null)
                    {
                        if (cancel.IsCancellationRequested)
                        {
                            progress.OnAbort();
                        }
                        else
                        {
                            progress.OnComplete();
                        }
                    }

                    _logger.LogInformation("DownloadAll complete.");
                }
                catch (Exception ex)
                {
                    _logger.LogError(ex, "DownloadAll error.");
                    if (progress != null)
                    {
                        progress.OnFault(ex);
                    }
                }
            }));
        }