public async Task Start(Action <DataPreprocessorOptions> action)
        {
            Stopped = false;
            var options = new DataPreprocessorOptions();

            if (action == null)
            {
                throw new ArgumentNullException();
            }
            action.Invoke(options);

            long     completed = 0;
            FileInfo fileInfo  = null;

            if (string.IsNullOrWhiteSpace(options.DataFileName) ||
                string.IsNullOrWhiteSpace(options.PDataFileName))
            {
                throw new ArgumentException();
            }

            var chunks = XmlDataFilesStorage.GetAsyncChunks(options.DataFileName);

            var ptdList = new List <PTurnData>();

            await foreach (var chunk in chunks)
            {
                ptdList.AddRange(GetPTurnData(chunk));

                if (ptdList.Count >= PTurnOptions.BufferSize)
                {
                    await TurnDataFilesStorage.WriteAsync(options.PDataFileName, ptdList.ToArray());

                    fileInfo ??= await GetFileInfoAsync(options.DataFileName);

                    completed += PTurnOptions.BufferSize * GetUnitSize(ptdList[0]);

                    if (Stopped)
                    {
                        if (OnPreprocessorStop != null)
                        {
                            OnPreprocessorStop.Invoke(new PreprocessorTracker(completed, fileInfo.Length));
                        }
                        break;
                    }
                    else
                    if (OnPreprocessorChanged != null)
                    {
                        OnPreprocessorChanged.Invoke(new PreprocessorTracker(completed, fileInfo.Length));
                    }
                    ptdList.Clear();
                }
            }
        }
        public async Task SaveAsync(string fileName, bool validateDataFile = false)
        {
            if (string.IsNullOrWhiteSpace(fileName))
            {
                throw new ArgumentException();
            }

            if (XmlDataFilesStorage.Exists(fileName) && validateDataFile &&
                !(await XmlDataFilesStorage.ValidateXmlFile(fileName)))
            {
                throw new InvalidOperationException("Invalid xml data format");
            }

            var xmlStr = GetXmlString();
            await XmlDataFilesStorage.WriteXmlAsync(fileName, xmlStr);

            PlayDataList.Clear();
        }
 private async Task <FileInfo> GetFileInfoAsync(string fileName)
 {
     return(await XmlDataFilesStorage.GetFileInfoAsync(fileName));
 }