在调试代码时,在大多数情况下,调试后的行会以黄色为背景(由Visual调试器)高亮显示。这是截图:
但是,在某些情况下,调试后的行会突出显示橙色背景:下面是屏幕截图:
此外,有时当我按下F10按钮时,代码行背景从黄色更改为橙色,反之亦然。这些变化背后的模式是什么?
PS -我想知道这是否与我的程序有两个独立的线程在后台运行这一事实有关?
发布于 2016-05-09 16:23:05
我想知道这是否与我的程序有两个独立线程的事实有关?
是的,非常喜欢。橙色背景色是为了警告您,发生了线程上下文切换,并且您不再调试之前查看的线程。注意箭头上的蓝色感叹号覆盖,这是额外的警告。
一些示例代码使它变得非常清晰:
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,执行将在断点停止。背景是黄色的。使用调试> Windows >线程,注意当前线程上的黄色箭头。
现在按F10键。
有三件事可以发生,结果完全是随机的:
还可以在线程调试器窗口中观察黄色标记。在第一个标记没有移动的子弹中,同一个线程激活了断点。背景颜色是黄色。如果标记确实移动,从而匹配最后两个子弹,那么背景颜色是橙色的。
反复按F10以获得所有可能的结果。请注意,背景颜色选择与当前线程是否在线程窗口中更改完全匹配。第三个项目是这个示例程序中最有可能的结果。
接下来您应该尝试的是右键单击线程窗口中的其他线程,然后选择冻结。现在,按下F10时总是会碰到相同的线程,并且突出显示总是黄色的。当调试线程变得太困难时,您需要做的事情。
长话短说,知道您正在调试不同的线程是相当重要的。局部变量和堆栈跟踪可能非常不同。橙色的背景和蓝色的感叹警告你。
https://stackoverflow.com/questions/36982551
复制