public void Dispose()
        {
            if (_cancellationTokenSource.IsCancellationRequested)
            {
                return;
            }

            _cancellationTokenSource.Cancel();
            if (_dataStream == null)
            {
                return;
            }

            SafeExecute.Sync(() => {
                _dataStream.Flush();
                _dataStream.Close();
            }, false);
        }
        private void SaveStatistics()
        {
            SafeExecute.Sync(() => {
                var stat       = _statisticData.OrderBy(x => x.Key);
                var statistics = String.Format("{0,10} | {1,10}", "Process", "Count") + Environment.NewLine;
                statistics    += new String('-', 24) + Environment.NewLine;
                foreach (var process in stat)
                {
                    statistics += String.Format("{0,10} | {1,10}", process.Key, process.Value) + Environment.NewLine;
                }

                using (var statisticStream = new StreamWriter(StatisticFilePath, true, Encoding.UTF8, 65536))
                {
                    statisticStream.Write(statistics);
                    statisticStream.Flush();
                }
            });
        }
        private void DataProcess(CancellationToken cancellationToken)
        {
            var writeCount = 0;

            while (!cancellationToken.IsCancellationRequested)
            {
                if (!_dataFileQueue.TryDequeue(out var content))
                {
                    Thread.Sleep(DelayMilliseconds);
                    continue;
                }

                if (_dataStream == null)
                {
                    SafeExecute.Sync(() => _dataStream = new StreamWriter(DataFilePath, true, Encoding.UTF8, 65536));
                }

                writeCount++;
                if (writeCount > 1000)
                {
                    writeCount = 0;
                    SafeExecute.Sync(() => _dataStream.Flush());
                    SafeExecute.Sync(() => _dataStream.Close());
                    _dataStream = null;
                    GC.Collect();

                    SafeExecute.Sync(() => _dataStream = new StreamWriter(DataFilePath, true, Encoding.UTF8, 65536));
                }

                try
                {
                    _dataStream.Write(content);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);

                    SafeExecute.Sync(() => _dataStream.Close());

                    SafeExecute.Sync(() => _dataStream = new StreamWriter(DataFilePath, true, Encoding.UTF8, 65536));
                }
            }
        }