当我调试代码时,在大多数情况下,调试行会突出显示(通过Visual Studio调试器)黄色背景。这是截图:
此外,有时当我按下F10按钮时,代码行背景从黄色变为橙色,反之亦然。这些变化背后的模式是什么?
PS - 我想知道这是否与我的程序有两个在后台运行的独立线程有关?
答案 0 :(得分:5)
我想知道这是否与我的程序有两个独立的线程
有关
是的,非常如此。橙色背景颜色用于警告您发生了线程上下文切换,并且您不再调试先前查看过的线程。请注意箭头上的蓝色感叹号覆盖,这是一个额外的警告。
一些示例代码使其清晰:
using System;
using System.Threading;
class Program {
static void Main(string[] args) {
new Thread(Example).Start();
new Thread(Example).Start();
Console.ReadLine();
}
static void Example() {
var rng = new Random(Thread.CurrentThread.ManagedThreadId);
for (int loop = 0; loop < 10000; ++loop) {
Thread.Sleep(rng.Next(0, 100));
Thread.Sleep(rng.Next(0, 100));
Thread.Sleep(rng.Next(0, 100));
Thread.Sleep(rng.Next(0, 100));
Thread.Sleep(rng.Next(0, 100));
Thread.Sleep(rng.Next(0, 100));
Thread.Sleep(rng.Next(0, 100));
}
}
}
在其中一个Thread.Sleep()调用上设置断点。按F5键,执行将在断点处停止。背景是黄色的。使用Debug&gt; Windows&gt;线程,注意当前线程上的黄色箭头。
现在按F10。
可能发生以下三种情况之一,结果完全是随机的:
还要观察Threads调试器窗口中的黄色标记。在标记未移动的第一个项目中,同一个线程激活了中断。背景颜色为黄色。如果标记确实移动,从而匹配最后2个子弹,则背景颜色为橙色。
反复按F10以获得所有可能的结果。请注意,背景颜色选择与“线程”窗口中当前线程是否更改完全匹配。第三个项目符号是此示例程序中最有可能的结果。
您应该尝试的下一个实验是右键单击“线程”窗口中的另一个线程并选择“冻结”。现在按F10始终按下相同的线程,突出显示始终为黄色。调试线程时需要做的事情变得非常困难。
长话短说,知道你正在调试一个不同的线程是非常重要的。局部变量和堆栈跟踪可能完全不同。橙色背景和蓝色感叹号警告你。