public void Run(CancellationTokenSource cancelToken = null) { if (cancelToken is null) { cancelToken = new CancellationTokenSource(); } if (!Directory.Exists(($@"{FolderPath}\AverageVals\"))) { Directory.CreateDirectory(($@"{FolderPath}\AverageVals\")); } Dictionary <int, int> threadsRowsCount = new Dictionary <int, int>(); Parallel.ForEach(DecriptedFiles, new ParallelOptions { CancellationToken = cancelToken.Token }, (filePath) => //paths.ToList().ForEach(filePath => { int strangeValuesFileNumber = 0; int threadId = Thread.CurrentThread.ManagedThreadId; lock (StrangeLocker) { if (!threadsRowsCount.ContainsKey(threadId)) { threadsRowsCount.Add(threadId, 0); } strangeValuesFileNumber = threadId * 10_000 + threadsRowsCount[threadId] / MAX_ROWS_IN_CSV; } StreamWriter strangeValuesWriter = new StreamWriter($@"{FolderPath}\AverageVals\strangeValues{strangeValuesFileNumber}.csv", true, Encoding.Default); StreamReader sr = new StreamReader(filePath, Encoding.Default); string fileName = Path.GetFileNameWithoutExtension(filePath); string buffer = sr.ReadLine(); while (!(buffer is null)) { var strParts = buffer.Split(';'); string dateStr = strParts[0]; DateTime dateVal; bool b = DateTime.TryParse(dateStr, out dateVal); if (b && dateVal > new DateTime(1980, 1, 1)) { double dValue = Convert.ToDouble(strParts[1]); TicketInfo ticketName = Tickets.FirstOrDefault(x => x.TicketName == strParts[2]); if (!(ticketName is null)) { StringDateTimeKey key = new StringDateTimeKey(ticketName.TicketName, dateVal, AccuracyPeriod); TicketAtRange pair; lock (AverageLocker) { if (AverageValsDictionary.ContainsKey(key)) { pair = AverageValsDictionary[key]; } else { pair = new TicketAtRange(ticketName, dateVal); AverageValsDictionary.Add(key, pair); } } bool doneMerge = pair.Merge(dValue); if (!doneMerge) { string err = $"{fileName}; {dateStr}; {key.Name}; {dValue}"; strangeValuesWriter.WriteLine(err); lock (StrangeLocker) { threadsRowsCount[threadId]++; } } } } buffer = sr.ReadLine(); } strangeValuesWriter.Close(); sr.Close(); ProgressAction?.Invoke(); });
public TicketAtRange(TicketInfo ticket, DateTime dateTime) { Ticket = ticket; DateTimeValue = dateTime; }