NLog MappedDiagnosticsLogicalContext无法使用ConfigureAwait在异步/等待中工作(false)

Kei*_*ith 6 c# nlog

我使用的是NLog 4.3.5和.Net framework 4.6.1

当我开始服务器端操作时,我打电话给:

NLog.MappedDiagnosticsLogicalContext.Set("OperationId", Guid.NewGuid());
Run Code Online (Sandbox Code Playgroud)

这将映射并显示在我的日志文件中.一切都很好......或者是它?在查看我的日志文件时,我注意到这个操作id值似乎没有像我预期的那样工作.

例:

  1. 在线程19中,操作开始并设置上下文.

  2. 它在所有await调用上使用.ConfigureAwait(false)

  3. 它执行一个

    var tasks = items.Select(item => Task.Run( () => { /* do stuff */}
    await Task.WhenAll(tasks).ConfigureAwait(false)
    
    Run Code Online (Sandbox Code Playgroud)
  4. 用于这些任务的线程之一是线程31(以后记住这一点)
  5. 同时,在线程36中,调用不同的服务器方法并开始新的操作.使用它的唯一操作ID编写了几条日志消息
  6. 此操作使用ConfigureAwait执行2个不同的等待调用(false)
  7. 下一个日志语句出现在线程31上.从那时起,它记录为在线程19上开始的操作创建的操作ID!

我没想到会发生这种情况,也不确定它是如何发生的.但是,当我查看我的日志历史时,我发现此类事情之前已经发生过.

我认为逻辑调用上下文应该继续存在.是否使用了导致此行为的ConfigureAwait(false)?这是我唯一能想到的......

Kei*_*ith 2

找到了我认为的问题所在。 https://github.com/NLog/NLog/issues/934