我想知道这是否与我的程序有两个独立的线程有关
是的,非常有关。橙色背景颜色意味着出现了线程上下文切换,并且您不再调试之前查看的线程。请注意箭头上的蓝色感叹号叠加,它是一个额外的警告。
以下是一些示例代码,可以使它变得更加清晰易懂:
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>Windows>Threads,在当前线程上注意到黄色箭头。
现在按F10键。
可能会发生以下三种情况之一,结果完全随机:
还要观察“Threads”调试器窗口中的黄色标记。在第一条信息中,该标记未移动,同一线程激活了断点。背景颜色是黄色。如果标记移动了,即与最后2条信息匹配,则背景颜色为橙色。
重复按F10以获取所有可能的结果。请注意,背景颜色的选择与当前线程是否在“Threads”窗口中更改完全匹配。第三条信息是此示例程序中最有可能的结果。
下一个实验应该尝试右键单击“Threads”窗口中的其他线程,然后选择“Freeze”。现在按F10键始终触发相同的线程,突出显示始终为黄色。当调试线程变得太困难时需要做的一种操作。
长话短说,知道您正在调试不同的线程相当重要。本地变量和堆栈跟踪可能会有很大的区别。橙色背景和蓝色感叹号警告您。