/// <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); } } }
/// <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); } }
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); } }
/// <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); } }