use*_*689 2 c# task-parallel-library async-await tracesource
我试图使用Trace.CorrelationManager.ActivityId来关联日志条目.但是,我发现此代码完成时:
var result = await Task.Run(() => LongRunningMethod());
Run Code Online (Sandbox Code Playgroud)
ActivityId已经从输入时改变了.在LongRunningMethod()中它是正确的(我在方法中有各种跟踪事件),它似乎只在await完成时改变.
我的问题是为什么ActivityId改变了?
这行代码在使用async声明的函数中,而async又由MVC项目中的异步控制器操作调用:
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
}
Run Code Online (Sandbox Code Playgroud)
也许我错误地使用async/await或Task方法?我基本上希望所有'LongRunningMethod'同时异步启动,然后等到所有完成.
Jon*_*ner 10
你没有做错,但它不会奏效.
在WCF和ASP.NET(包括MVC)下,在框架执行请求之前,它会捕获当前上下文,因此可以恢复它以确保完成在原始线程上运行.
不幸的是,这会在您的控制器被调用之前发生.系统的快照发生在您有机会更新ActivityID之前.在继续中,上下文将重置为您设置之前的值.
我发现,如果将.ConfigureAwait(false)添加到任务中,则继续不必在原始上下文上运行,因此将恢复您的活动ID.
我目前没有更好的解决方案,除了使用CallContext.LogicalGetData/LogicalSetData来管理自己的ActivityID.对于我在EventSourceProxy中处理它的方式,请参阅https://github.com/jonwagner/EventSourceProxy/commit/fa43c6acd07690dcd276346e3fcf25028f796b8c
这是一个更深入解释的伟大文章.
| 归档时间: |
|
| 查看次数: |
1725 次 |
| 最近记录: |