Mercurial > pub > ImplabNet
comparison Implab/Diagnostics/TextListenerBase.cs @ 50:f8cbe84cfdb1
Слияние с interactive logger
| author | cin | 
|---|---|
| date | Fri, 18 Apr 2014 12:37:48 +0400 | 
| parents | d9d794b61bb9 | 
| children | 4c0e5ef99986 | 
   comparison
  equal
  deleted
  inserted
  replaced
| 44:e5ec543feee3 | 50:f8cbe84cfdb1 | 
|---|---|
| 8 | 8 | 
| 9 readonly Dictionary<object, Action> m_subscriptions = new Dictionary<object, Action>(); | 9 readonly Dictionary<object, Action> m_subscriptions = new Dictionary<object, Action>(); | 
| 10 readonly LogicalOperation m_boundOperation; | 10 readonly LogicalOperation m_boundOperation; | 
| 11 readonly int m_baseIndent; | 11 readonly int m_baseIndent; | 
| 12 | 12 | 
| 13 protected TextListenerBase(bool local) { | 13 protected TextListenerBase(bool global) { | 
| 14 Register(this); | 14 Register(this); | 
| 15 if (local) { | 15 if (!global) { | 
| 16 m_boundOperation = TraceContext.Current.CurrentOperation; | 16 m_boundOperation = TraceContext.Current.CurrentOperation; | 
| 17 m_baseIndent = Math.Max(0, m_boundOperation.Level - 1); | 17 m_baseIndent = Math.Max(0, m_boundOperation.Level - 1); | 
| 18 } | 18 } | 
| 19 } | 19 } | 
| 20 | 20 | 
| 34 | 34 | 
| 35 lock (m_subscriptions) { | 35 lock (m_subscriptions) { | 
| 36 AssertNotDisposed(); | 36 AssertNotDisposed(); | 
| 37 | 37 | 
| 38 var formatter = GetService<IEventTextFormatter<TEvent>>(); | 38 var formatter = GetService<IEventTextFormatter<TEvent>>(); | 
| 39 var channelName = channel.Name; | |
| 39 | 40 | 
| 40 EventHandler<ValueEventArgs<TEvent>> handler = (sender, args) => { | 41 EventHandler<ValueEventArgs<TEvent>> handler = (sender, args) => { | 
| 41 TraceContext context = (TraceContext)sender; | 42 TraceContext context = (TraceContext)sender; | 
| 42 var text = formatter.Format(context, args.Value); | 43 var text = formatter.Format(context, args.Value); | 
| 43 text.indent -= m_baseIndent; | 44 text.indent -= m_baseIndent; | 
| 44 | 45 | 
| 45 if (IsRelated(context.CurrentOperation)) | 46 if (IsRelated(context.CurrentOperation)) | 
| 46 WriteEntry(context, text); | 47 WriteEntry(context, text, channelName); | 
| 47 }; | 48 }; | 
| 48 | 49 | 
| 49 if (m_subscriptions.ContainsKey(channel)) | 50 if (m_subscriptions.ContainsKey(channel)) | 
| 50 return; | 51 return; | 
| 51 | 52 | 
| 87 subscription(); | 88 subscription(); | 
| 88 m_subscriptions.Clear(); | 89 m_subscriptions.Clear(); | 
| 89 } | 90 } | 
| 90 } | 91 } | 
| 91 | 92 | 
| 92 protected abstract void WriteEntry(TraceContext context, EventText text); | 93 /// <summary> | 
| 94 /// Вызывается для записи текста сообщения, в журнал. | |
| 95 /// </summary> | |
| 96 /// <remarks> | |
| 97 /// Данный метод может вызваться из разных потоков одновременно. Возможна ситуация, когда | |
| 98 /// данный метод вызывается уже после освобождения ообъекта методом <see cref="Dispose()"/>. | |
| 99 /// </remarks> | |
| 100 /// <param name="context">Контекст трассировки.</param> | |
| 101 /// <param name="text">Текст сообщения.</param> | |
| 102 protected abstract void WriteEntry(TraceContext context, EventText text, string channel); | |
| 93 | 103 | 
| 94 public EventText Format(TraceContext context, object data) { | 104 public EventText Format(TraceContext context, object data) { | 
| 95 return new EventText { | 105 return new EventText { | 
| 96 indent = context.CurrentOperation.Level, | 106 indent = context.CurrentOperation.Level, | 
| 97 content = data.ToString() | 107 content = data.ToString() | 
| 108 content = data.ToString() | 118 content = data.ToString() | 
| 109 }; | 119 }; | 
| 110 } | 120 } | 
| 111 | 121 | 
| 112 protected override void Dispose(bool disposing) { | 122 protected override void Dispose(bool disposing) { | 
| 123 base.Dispose(disposing); | |
| 113 if (disposing) { | 124 if (disposing) { | 
| 114 UnsubscribeAll(); | 125 UnsubscribeAll(); | 
| 115 } | 126 } | 
| 116 base.Dispose(disposing); | |
| 117 } | 127 } | 
| 118 } | 128 } | 
| 119 } | 129 } | 
