【问题标题】:Supplement / override System.Diagnostic.Trace messages with context from parent TPL Task使用来自父 TPL 任务的上下文补充/覆盖 System.Diagnostic.Trace 消息
【发布时间】:2018-06-16 21:56:41
【问题描述】:

我有一个基于插件的系统,它大量使用 .Net Task / TPL 来执行并行工作流。 worker 是执行各种类型任务的插件,构建在主处理应用程序之外,编译为 DLL 并放入插件目录中。

worker 插件将使用 Trace 消息来输出他们正在做的事情。我很想用仅在父应用程序中知道的附加上下文信息来补充这些 Trace 消息。这也意味着我需要以某种方式弄清楚跟踪消息来自什么上下文(它来自哪个 Task)

具体用例:

  • 父应用程序从队列中选择要完成的“工作”。
  • 应用程序找到合适的工作插件来执行所请求的工作类型
  • 父级创建一个新任务供插件在其中工作,建立一个与此工作任务关联的 WorkID 并启动进程
  • 当插件使用 Trace.WriteLine() 之类的东西时,我希望用从主应用程序建立的 WorkID 来补充该消息(插件对此一无所知)

我知道我可以将日志实现传递给插件,但是我必须重新编写我所有的插件以期望,并使用该日志实现。

有没有办法做到这一点?

【问题讨论】:

标签: .net plugins task-parallel-library


【解决方案1】:

根据@barakcaf 的建议,我调查了CallContext 解决了我的问题。

例子:

    public async Task TopFunction(string someContextualData)
    {
        CallContext.LogicalSetData("MyVar", someContextualData);

        await ChildFunction();
    }

    public async Task ChildFunction()
    {
        string someContextualData = (string)CallContext.LogicalGetData("MyVar");
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 2020-07-19
    相关资源
    最近更新 更多