Mercurial > pub > ImplabNet
diff Implab/Diagnostics/TraceContext.cs @ 52:edf0bc558596
improved trace system
author | cin |
---|---|
date | Mon, 05 May 2014 07:35:48 +0400 |
parents | d9d794b61bb9 |
children | 790e8a997d30 |
line wrap: on
line diff
--- a/Implab/Diagnostics/TraceContext.cs Sat Apr 26 23:36:00 2014 +0400 +++ b/Implab/Diagnostics/TraceContext.cs Mon May 05 07:35:48 2014 +0400 @@ -116,7 +116,7 @@ /// </summary> /// <returns>Копия текущего контекста трассировки.</returns> public static TraceContext Snapshot() { - return _current == null ? new TraceContext() : new TraceContext(_current); + return _current == null ? new TraceContext() : new TraceContext(_current,false); } /// <summary> @@ -131,7 +131,8 @@ try { action(); } finally { - _current.EndAllOperations(); + if(_current != null) + _current.EndAllOperations(); _current = old; } } @@ -197,6 +198,32 @@ } /// <summary> + /// Создает копию контекста и возвращается на предыдущую операцию в текущем контексте, это позволяет начать операцию в одном потоке, а завершить - в другом. + /// </summary> + /// <returns>Контекст трассировки, который можно присоединить к другому потоку.</returns> + public TraceContext DetachLogicalOperation() { + if (m_bound == m_currentOperation) { + return new TraceContext(); + } else { + var detached = new TraceContext(this, true); + m_currentOperation = m_currentOperation.Parent; + return detached; + } + } + + public void BindLogicalOperationToPromise(IPromiseBase promise) { + Safe.ArgumentNotNull(promise, "promise"); + + var ctx = DetachLogicalOperation(); + promise.Finally(() => { + var old = _current; + TraceContext.Attach(ctx); + TraceContext.Current.EndLogicalOperation(); + _current = old; + }); + } + + /// <summary> /// Заврешает все начатые в этом контексте операции /// </summary> public void EndAllOperations() {