diff --git a/Implab/Diagnostics/TraceContext.cs b/Implab/Diagnostics/TraceContext.cs
--- a/Implab/Diagnostics/TraceContext.cs
+++ b/Implab/Diagnostics/TraceContext.cs
@@ -116,7 +116,7 @@ namespace Implab.Diagnostics {
///
/// Копия текущего контекста трассировки.
public static TraceContext Snapshot() {
- return _current == null ? new TraceContext() : new TraceContext(_current);
+ return _current == null ? new TraceContext() : new TraceContext(_current,false);
}
///
@@ -131,7 +131,8 @@ namespace Implab.Diagnostics {
try {
action();
} finally {
- _current.EndAllOperations();
+ if(_current != null)
+ _current.EndAllOperations();
_current = old;
}
}
@@ -197,6 +198,32 @@ namespace Implab.Diagnostics {
}
///
+ /// Создает копию контекста и возвращается на предыдущую операцию в текущем контексте, это позволяет начать операцию в одном потоке, а завершить - в другом.
+ ///
+ /// Контекст трассировки, который можно присоединить к другому потоку.
+ 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;
+ });
+ }
+
+ ///
/// Заврешает все начатые в этом контексте операции
///
public void EndAllOperations() {
diff --git a/Implab/Diagnostics/TraceEvent.cs b/Implab/Diagnostics/TraceEvent.cs
--- a/Implab/Diagnostics/TraceEvent.cs
+++ b/Implab/Diagnostics/TraceEvent.cs
@@ -21,7 +21,10 @@ namespace Implab.Diagnostics {
}
public override string ToString() {
- return String.Format("{0}: {1}", EventType, Message);
+ if (EventType == TraceEventType.Information)
+ return Message;
+ else
+ return String.Format("{0}: {1}", EventType, Message);
}
public static TraceEvent Create(TraceEventType type, string format, params object[] args) {
diff --git a/Implab/Diagnostics/TraceLog.cs b/Implab/Diagnostics/TraceLog.cs
--- a/Implab/Diagnostics/TraceLog.cs
+++ b/Implab/Diagnostics/TraceLog.cs
@@ -28,6 +28,11 @@ namespace Implab.Diagnostics {
}
[Conditional("TRACE")]
+ public static void BindLogicalOperationToPromise(IPromiseBase promise) {
+ TraceContext.Current.BindLogicalOperationToPromise(promise);
+ }
+
+ [Conditional("TRACE")]
public static void TraceInformation(string format, params object[] arguments) {
LogChannel.Default.LogEvent(TraceEvent.Create(TraceEventType.Information, format, arguments));
}