Amoeba.TransfarLimitManager.WatchThread C# (CSharp) Method

WatchThread() private method

private WatchThread ( ) : void
return void
        private void WatchThread()
        {
            try
            {
                var stopwatch = new Stopwatch();

                var now = DateTime.Today;

                lock (_thisLock)
                {
                    foreach (var item in _settings.UploadTransferSizeList.ToArray())
                    {
                        if ((now - item.Key).TotalDays >= _settings.TransferLimit.Span)
                        {
                            _settings.UploadTransferSizeList.Remove(item.Key);
                        }
                    }

                    foreach (var item in _settings.DownloadTransferSizeList.ToArray())
                    {
                        if ((now - item.Key).TotalDays >= _settings.TransferLimit.Span)
                        {
                            _settings.DownloadTransferSizeList.Remove(item.Key);
                        }
                    }
                }

                for (;;)
                {
                    Thread.Sleep(1000 * 1);
                    if (this.State == ManagerState.Stop) return;

                    if (!stopwatch.IsRunning || stopwatch.ElapsedMilliseconds > 1000 * 20)
                    {
                        stopwatch.Restart();

                        if (now != DateTime.Today)
                        {
                            now = DateTime.Today;

                            lock (_thisLock)
                            {
                                foreach (var item in _settings.UploadTransferSizeList.ToArray())
                                {
                                    if ((now - item.Key).TotalDays >= _settings.TransferLimit.Span)
                                    {
                                        _settings.UploadTransferSizeList.Remove(item.Key);
                                    }
                                }

                                foreach (var item in _settings.DownloadTransferSizeList.ToArray())
                                {
                                    if ((now - item.Key).TotalDays >= _settings.TransferLimit.Span)
                                    {
                                        _settings.DownloadTransferSizeList.Remove(item.Key);
                                    }
                                }

                                _uploadSize = -_amoebaManager.SentByteCount;
                                _downloadSize = -_amoebaManager.ReceivedByteCount;
                            }

                            if (_amoebaManager.State == ManagerState.Stop) this.OnStartEvent();
                        }
                        else
                        {
                            lock (_thisLock)
                            {
                                _settings.UploadTransferSizeList[now] = _uploadSize + _amoebaManager.SentByteCount;
                                _settings.DownloadTransferSizeList[now] = _downloadSize + _amoebaManager.ReceivedByteCount;
                            }
                        }

                        if (_settings.TransferLimit.Type == TransferLimitType.Uploads)
                        {
                            var totalUploadSize = _settings.UploadTransferSizeList.Sum(n => n.Value);

                            if (totalUploadSize > _settings.TransferLimit.Size)
                            {
                                if (_amoebaManager.State == ManagerState.Start) this.OnStopEvent();
                            }
                        }
                        else if (_settings.TransferLimit.Type == TransferLimitType.Downloads)
                        {
                            var totalDownloadSize = _settings.DownloadTransferSizeList.Sum(n => n.Value);

                            if (totalDownloadSize > _settings.TransferLimit.Size)
                            {
                                if (_amoebaManager.State == ManagerState.Start) this.OnStopEvent();
                            }
                        }
                        else if (_settings.TransferLimit.Type == TransferLimitType.Total)
                        {
                            var totalUploadSize = _settings.UploadTransferSizeList.Sum(n => n.Value);
                            var totalDownloadSize = _settings.DownloadTransferSizeList.Sum(n => n.Value);

                            if ((totalUploadSize + totalDownloadSize) > _settings.TransferLimit.Size)
                            {
                                if (_amoebaManager.State == ManagerState.Start) this.OnStopEvent();
                            }
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Log.Error(e);
            }
        }