Пример #1
0
        /// <summary>
        /// 清理30分钟没有发生读写的文件流。对于日志文件按天产生的非常有用。
        /// </summary>
        private void Execute()
        {
            while (FStop == false)
            {
                try
                {

                    lock (typeof(LocalLockObject))
                    {
                        foreach (var theItem in _Workers)
                        {
                            if (DateTime.Now.Subtract(theItem.Value.LastExecTime).Minutes > Timeout)
                            {
                                theItem.Value.CloseLogThread();
                                _Workers.Remove(theItem.Key);
                            }
                        }
                    }
                    Thread.Sleep(100000);
                }
                catch (Exception ex)
                {
                    SysAppEventWriter.WriteEvent(-1, ex.Message, System.Diagnostics.EventLogEntryType.Error);
                }
            }
        }
Пример #2
0
 /// <summary>
 /// 结束日志内置线程,并关闭所有文件流。程序正常退出时调用.
 /// </summary>
 public void CloseAll()
 {
     FStop = true;
     if (_writerThread != null)
     {
         _writerThread.Join();
     }
     try
     {
         lock (typeof(LocalLockObject))
         {
             if (_Workers != null)
             {
                 foreach (var theItem in _Workers)
                 {
                     theItem.Value.CloseLogThread();
                     _Workers.Remove(theItem.Key);
                 }
             }
         }
     }
     catch (Exception ex)
     {
         SysAppEventWriter.WriteEvent(-1, ex.Message, System.Diagnostics.EventLogEntryType.Error);
     }
 }
Пример #3
0
        public FileLogWorker(string FilePath)
        {
            try
            {
                if (string.IsNullOrEmpty(SP.ep.SendBlockDueTime))
                {
                    DueTime = Convert.ToInt32(SP.ep.SendBlockDueTime);
                }

                if (string.IsNullOrEmpty(SP.ep.SendBlockBatchMaxNum))
                {
                    BatchMaxNum = Convert.ToInt32(SP.ep.SendBlockBatchMaxNum);
                }

                this.FilePath = FilePath;
                //_streamWriter = new StreamWriter(FilePath, true);
                //为避免进程占用文件导致异常,使用FileShare.ReadWrite
                fs            = new FileStream(FilePath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
                _streamWriter = new StreamWriter(fs);

                _logCaches = new BatchBlock <string>(BatchMaxNum);

                ab = new ActionBlock <string[]>((stringArray) =>
                {
                    if (stringArray != null && stringArray.Length > 0)
                    {
                        foreach (var item in stringArray)
                        {
                            _streamWriter.WriteLine(item);
                        }

                        _streamWriter.Flush();
                        LastExecTime = DateTime.Now;
                    }

                    //_streamWriter.WriteLine(string.Format(" cdcd current taskID:{0} ,current thread :{1} ", Task.CurrentId, Thread.CurrentThread.ManagedThreadId));
                    //_streamWriter.Flush();
                },
                                                new ExecutionDataflowBlockOptions
                {
                    MaxDegreeOfParallelism = 1
                });

                _logCaches.LinkTo(ab);

                triggerBatchTimer = new Timer((obj) => _logCaches.TriggerBatch());

                _logCaches.Completion.ContinueWith(delegate { ab.Complete(); });
            }
            catch (Exception ex)
            {
                SysAppEventWriter.WriteEvent(-1, ex.Message, System.Diagnostics.EventLogEntryType.Error);
            }
        }
Пример #4
0
 /// <summary>
 /// 结束日志内置线程,并关闭所有文件流。程序正常退出时调用.
 /// </summary>
 public override void CloseLogThread()
 {
     try
     {
         _logCaches.Complete();
         ab.Completion.Wait();
         triggerBatchTimer.Dispose();
     }
     catch (Exception ex)
     {
         SysAppEventWriter.WriteEvent(-1, ex.Message, System.Diagnostics.EventLogEntryType.Error);
     }
 }