private async Task <IList <T> > CheckAndLoadFromCacheAsync <T>(string fileName, Model.WorkTask workTask)
        {
            FileInfo fileInfo       = new System.IO.FileInfo(fileName);
            List <T> data           = null;
            string   cachedFileName = this.GetDbTableNamePath(fileName);

            if (this.dataFilesInfo.ContainsKey(fileName))
            {
                workTask.UpdateStatus($"загрузка данных из кэша ...");
                workTask.IsIndeterminate = true;

                DataFileRecord info = this.dataFilesInfo[fileName];

                if (info.LastModified == fileInfo.LastWriteTime)
                {
                    T[] result = await this.DeserializeDataAsync <T>(cachedFileName);

                    if (result != null)
                    {
                        data = new List <T>(result);
                    }
                }
                else
                {
                    // расчет хэша файла и сравнение с ранее сохраненным
                    string hashAsString = this.CalculateSHA256(fileName);

                    if (string.Equals(info.Hash, hashAsString))
                    {
                        T[] result = await this.DeserializeDataAsync <T>(cachedFileName);

                        if (result != null)
                        {
                            data = new List <T>(result);
                        }
                    }
                    else
                    {
                        ;
                    }
                }
            }
            else
            {
                ;
            }

            return(data);
        }
        private void StoreHashAndSaveData <T>(FileInfo fileInfo, WorkTask workTask, T[] data)
        {
            string fileName = fileInfo.FullName;

            string msg = "вычисление контрольной-суммы файла ...";

            workTask.UpdateStatus(msg);
            workTask.IsIndeterminate = true;

            string hashAsString    = string.Empty;
            bool   isOk            = false;
            byte   numberOfRetries = 1;

            do
            {
                try
                {
                    hashAsString = this.CalculateSHA256(fileName);
                    isOk         = true;
                }
                catch (IOException ex)
                {
                    this.callBackAction(ex);
                    workTask.UpdateStatus(string.Format("{0}\nфайл используется другим процессом, попытка #{1}", msg, numberOfRetries));
                    Task.Delay(1_000);
                }

                numberOfRetries++;
            } while (isOk == false);

            DataFileRecord dataFileRecord = new DataFileRecord(fileName, hashAsString, fileInfo.LastWriteTime);

            if (this.dataFilesInfo.ContainsKey(fileName))
            {
                this.dataFilesInfo[fileName] = dataFileRecord;
            }
            else
            {
                this.dataFilesInfo.Add(fileName, dataFileRecord);
            }

            string cachedFileName = this.GetDbTableNamePath(fileName);

            _ = this.SerializeDataAsync <T>(data, cachedFileName);
        }