跨异步任务流动 Activity

问题描述 投票:0回答:1

在您不想等待的 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();
         }
     };
 }
c# asynchronous task open-telemetry
1个回答
0
投票

Activity.Current
AsyncLocal
,通过
ExecutionContext
跨任务飞行。
您可以明确捕获
ExecutionContext

ExecutionContext.Run(ExecutionContext.Capture()!.CreateCopy(),
    _ => Task.Run(() => { ... }), null);

或者禁用上下文传播

using (ExecutionContext.SuppressFlow())
    Task.Run(() => { ... });
© www.soinside.com 2019 - 2024. All rights reserved.