线程如何返回到与C#中的线程不同的位置?

线程如何返回到与C#中的线程不同的位置?,c#,return,callstack,C#,Return,Callstack,线程如何返回到与C#中的线程不同的位置 我在《通过C#的CLR》一书中看到了以下摘录: 每当您获得堆栈跟踪时,您可能会发现实际调用堆栈中的某些方法没有 出现在堆栈跟踪字符串中。这有两个原因首先,堆栈实际上是线程应该返回的位置的记录,而不是线程的来源。其次,即时(JIT)编译器可以内联方法,以避免调用和从单独方法返回的开销 这段摘录是否意味着一个线程不能返回到它来自的地方,或者它是否意味着其他东西?在前一种情况下,有人可以举一个例子,当一个线程没有返回到它的来源,请?在后一种情况下,有人能简单地解

线程如何返回到与C#中的线程不同的位置

我在《通过C#的CLR》一书中看到了以下摘录:

每当您获得堆栈跟踪时,您可能会发现实际调用堆栈中的某些方法没有 出现在堆栈跟踪字符串中。这有两个原因首先,堆栈实际上是线程应该返回的位置的记录,而不是线程的来源。其次,即时(JIT)编译器可以内联方法,以避免调用和从单独方法返回的开销

这段摘录是否意味着一个线程不能返回到它来自的地方,或者它是否意味着其他东西?在前一种情况下,有人可以举一个例子,当一个线程没有返回到它的来源,请?在后一种情况下,有人能简单地解释一下它的意思吗


对我来说,这段摘录令人困惑,因为我习惯了函数中
return
语句的行为——它们总是返回到调用方——线程来自的地方,我无法想象它们何时会返回到另一个地方。它与
async/await
语法糖有什么关系吗?

这篇摘录是关于将返回地址推送到堆栈上的目的的:它实际上是要返回的地址,而不是跳转的源地址


从另一个角度来看,调用不需要与返回配对:您可以使用
push-jump-return
,而不是
call-return
,它会将您放置到一个您按下的位置,而不是跳转的位置。

让我们考虑一下这个场景:

线程A启动线程B

线程B在线程C中开始并继续它的工作


现在它“返回”到线程C,尽管它是从线程A提交的。

线程从不“返回”任何东西到任何地方。如果没有人存储对它的引用,它就会结束并消失。就像你用枪射子弹一样。这是火&忘了吧。或者像关闭应用程序一样。它刚刚消失了。@Holger,你能解释一下通过C#book在CLR中返回的线程是什么意思吗?为此,我们需要一些代码。我们无法解释一本陌生书的文字。很可能,当你启动一个线程时,你会得到一个对该线程的引用。这就好比,如果你看到一架飞机离开,你会得到航班号作为回报。但这不能理解为“飞机正在向你归还一些东西”。“它仍然在空中飞行。”霍尔格,我们并不总是被授予这样一种奢侈品作为一个实际的例子。有时,只有理论向我们展示。:)如果有调用
f3
main
调用
f1
调用
f2
,并且在
f3
中抛出异常,那么您将期望在与异常关联的堆栈跟踪中看到f3、f2、f1和main。然而,抖动可能决定f2足够简单,以至于它在发布版本中内联。在这种情况下,如果要查看堆栈跟踪,则堆栈中不会列出
f2
。虽然这可能是一个有趣的问题,但您不必担心。如果能看到这样一个案例-
推-跳返回
,如何在C#中重现,那将是一件好事:)旁注:是否可以在C#中生成这样的函数(这似乎在问题中暗示)是一个非常不同的问题,但由于堆栈跟踪(这是问题所指的)显示了所有来自可能源的调用,包括本机方法,这确实是可能的(至少在理论上是可能的)查看返回到不同于调用原点的位置的方法。调用堆栈不会真正显示。。。而且线程不能真正“继续在其他线程上工作”-不完全清楚您在这里的意思。。。(托管线程可以在物理线程之间迁移…那?)是的,你的例子在关于堆栈跟踪(或者,一般来说)的问题中没有什么意义@Flydog57你需要解释一下为什么这解释了“首先,堆栈实际上是线程应该返回到哪里的记录,而不是线程来自哪里。”?每个线程都有自己的堆栈。线程不会“返回”到任何内容。它们一直运行到停止运行,然后停止(它们要么结束,要么返回到线程池)。每个线程都有自己的“工作”(事实上,当我向大家解释线程时,我通常会说“这项工作是从池中分派给另一个线程的”)。您可以加入一些同步机制,以便当一个线程完成时,另一个线程可以继续。但是,在堆栈跟踪中很难看到这一点