假设我有一个输入while
的工作线程,它在连续Task
循环内处理。每当外部代码将新的Environment.StackTrace
存入队列时,工作人员就会唤醒并等待任务实例。但是,如果引发异常,我想记录详细信息,包括完整的调用堆栈,以便我可以确定应该责备哪个代码路径。
不幸的是,异常的调用堆栈植根在工作线程中。这是可以理解的 - 它是执行任务的最根本代码。
问题是:我可以假设将异常调用堆栈与首先将任务存放到工作线程队列中的调用堆栈合并吗?
我知道我可以手动完成,只需通过async
记下存款调用堆栈并将其与工作中的异常一起记录下来。但是,我必须跟踪这两个独立的堆栈。
是否有更聪明的方法来欺骗异常自己的调用堆栈,看起来好像是连续的?因为它有点 - 当任务入队和出队时,点之间只有一点点延迟。
编辑:我基本上都在寻找一种方法来做C#' var box = new MessageBox([stuff]);
对调用堆栈的处理(即将它们合并到所有发生的线程跳跃中) ),只在我控制下的常规线程内。
答案 0 :(得分:1)
我知道我可以手动完成,只需记下存款调用堆栈
即可
这可能是更清洁的解决方案。
是否有更聪明的方法来欺骗异常自己的调用堆栈,看起来好像是连续的?
是的,有一个聪明的"解决方案 - 和大多数人一样聪明"解决方案,YMMV。
您可以使用AsyncLocal<T>
/ LogicalCallContext
自行跟踪因果关系链。一个容易被忽视的问题是the data stored in the logical call context must be immutable。这种方法的一个更严重(更幸运的是更罕见)的问题是,如果你有无限的&#34;递归&#34;异步调用,通常工作正常,但如果你在每次调用时增加因果链,你最终会得到无限的内存使用。
完成此设置后,您可以使用Fody / PostSharp /等自动将因果关系链跟踪注入您的方法。
我有一个AsyncDiagnostics library使用LogicalCallContext
与PostSharp
自动神奇地确定您的因果关系链。我先试试。