示例#1
0
        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();
            });
示例#2
0
 public TicketAtRange(TicketInfo ticket, DateTime dateTime)
 {
     Ticket        = ticket;
     DateTimeValue = dateTime;
 }