在您不想等待的 Task.Run 中流动 System.Diagnostics.Activity 的正确方法是什么?
例如,我有一个工作流程,仅通知某些第三方服务发生了事件,但我并不特别关心它们是否成功,也不关心通知何时完成。
public void NotifyExternalServices() {
//fire and forget
Task.Run(() => ExternalServices.NotifyOtherAll(new ThisHappenedEvent());
}
一切都运行得很好,但是将 OpenTelemetry 添加到组合中会使遥测变得非常混乱,因为“当前”事件发生了变化。
这是正确的使用模式吗?
public void NotifyExternalServices() {
var parentActivity = MyActivitySource.StartActivity();
//fire and forget
Task.Run(() {
Activity.Current = parentActivity;
try {
ExternalServices.NotifyOtherAll(new ThisHappenedEvent());
} finally {
parentActivity?.Dispose();
}
};
}
Activity.Current
是 AsyncLocal
,通过 ExecutionContext
跨任务飞行。ExecutionContext
。
ExecutionContext.Run(ExecutionContext.Capture()!.CreateCopy(),
_ => Task.Run(() => { ... }), null);
或者禁用上下文传播
using (ExecutionContext.SuppressFlow())
Task.Run(() => { ... });