gpt4 book ai didi

c# - 等待 Task.Run 在退出时更改跟踪 ActivityId

转载 作者:行者123 更新时间:2023-11-30 19:10:52 25 4
gpt4 key购买 nike

我正在尝试使用 Trace.CorrelationManager.ActivityId 关联日志条目。但是,我发现此代码何时完成:

var result = await Task.Run(() => LongRunningMethod());

ActivityId 与输入时的状态相比发生了变化。虽然在 LongRunningMethod() 中它是正确的(我在该方法中有各种跟踪事件),但它似乎只有在等待完成时才会改变。

我的问题是为什么 ActivityId 改变了?

这行代码在一个用 async 声明的函数中,它又被 MVC 项目中的异步 Controller 操作调用:

async public Task<ActionResult> Index()
{
...
var tasks = {list of Download<T> delegates}

var result = await Task.WhenAll(tasks)
}


async public Task<OperationResult> Download<T>(IEnumerable<T> data, Device device)
{
...
var result = await Task.Run(() => LongRunningMethod());

return result
}

也许我没有正确使用 async/await 或 Task 方法?我基本上希望所有“LongRunningMethod”同时异步启动,然后等到全部完成。

最佳答案

你没有做错,但它行不通。

在 WCF 和 ASP.NET(包括 MVC)下,在框架执行请求之前,它会捕获当前上下文,因此它可以恢复它以确保完成在原始线程上运行。

不幸的是,这发生在你的 Controller 被调用之前。系统快照发生在您有机会更新 ActivityID 之前。在后续中,上下文将重置为您设置之前的值。

我发现,如果您将 .ConfigureAwait(false) 添加到您的任务中,则延续不必在原始上下文中运行,因此您的事件 ID 将被恢复。

除了使用 CallContext.LogicalGetData/LogicalSetData 来管理您自己的 ActivityID 之外,目前我没有更好的解决方案。对于我在 EventSourceProxy 中的处理方式,请参见 https://github.com/jonwagner/EventSourceProxy/commit/fa43c6acd07690dcd276346e3fcf25028f796b8c

这是一篇关于更深入解释的精彩文章。

http://sticklebackplastic.com/post/2007/08/14/One-mighty-gotcha-for-SystemDiagnostic-activity-Ids.aspx

关于c# - 等待 Task.Run 在退出时更改跟踪 ActivityId,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14700777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com