【发布时间】:2017-06-13 23:57:12
【问题描述】:
在 C# 多线程编程中,当方法 A() 在新线程中调用方法 B() 时,例如通过使用这样的东西:
Task A()
{
// ...
// I want B to run in parallel, without A() waiting for it.
Task.Factory.StartNew(B);
}
void B()
{
// I attach a debugger here to look at the Call Stack.
// But that is empty and I can't see that A() actually called it (logically).
// Also Environment.StackTrace is pretty much empty of that path.
}
换句话说,在方法 B() 内部,堆栈跟踪对方法 A() 的调用路径一无所知,这反过来又触发了方法 B() 的执行。
有没有办法查看完整的逻辑堆栈跟踪,例如在B() 出现异常的情况下,您可以查看完整故事以了解A() 实际上叫它吗?
【问题讨论】:
-
@SimonPrice,这就是调试多线程程序的一般方法。 OP 正在寻找一种方法来找出哪个线程(以及调用堆栈到该点)启动了另一个线程/计划了一个任务,如果该任务引发异常。有什么更具体的吗?
-
我已经用更多细节更新了这个问题。您可以在 Visual Studio 中轻松创建此场景以亲自查看。
-
如果有帮助,我正在 UWP 应用程序中对此进行测试。
-
未捕获此信息。一个新的线程是一个新的起点。你能得到的最好的方法是给你的线程一个有用的名字。
标签: c# multithreading async-await task-parallel-library visual-studio-debugging