1

Когда я отлаживаю свой код, в большинстве случаев отлаживаемая строка выделяется (отладчиком Visual Studio) с желтым фоном. Вот скриншот: enter image description hereВыделение линии Visual Studio в режиме отладки

Но, в некоторых случаях отлаженная линия подсвечивается Оранжевый фон: Вот скриншот: enter image description here

Кроме того, иногда, когда я нажатии кнопки F10 фона код строки изменен с желтого на оранжевый и наоборот. Какова закономерность этих изменений?

PS - Интересно, связано ли это с тем, что моя программа имеет два отдельных потока, которые работают в фоновом режиме?

+1

Возможно, оранжевый, потому что это комбинация желтого (текущая строка исполнения) и красного (точка останова)? – David

+1

Оранжевый - это когда у вас много потоков. –

+0

Я не думаю, что это связано с winforms. Было бы здорово, если бы вы заменили winforms-тег на версию VS, потому что раскраска, скорее всего, зависит от версии – Breeze

ответ

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> Windows> Threads, обратите внимание на желтую стрелку на текущем потоке.

Теперь нажмите F10.

Одна из трех вещей может произойти, результат абсолютно случаен:

  • Вы шаг к следующему оператору в том же потоке.
  • Вторая нить также может попасть в точку останова.
  • Второй поток может быть первым, кто приземлится на инструкцию и вызовет разрыв отладчика.

Также обратите внимание на желтый маркер в окне отладки Threads. В первой пуле маркер не двигался, тот же поток активировал перерыв. Цвет фона желтый. Если маркер действительно двигался, таким образом, сопоставляя последние 2 пули, тогда цвет фона оранжевый.

Нажимайте F10 для получения всех возможных результатов. И обратите внимание, что выбор цвета фона является точным совпадением с тем, изменился ли текущий поток в окне Threads. Третья пуля - самый вероятный результат в этой примерной программе.

Следующий эксперимент, который вы должны попробовать, - это щелкнуть правой кнопкой мыши по другой теме в окне Threads и выбрать Freeze. Нажатие F10 теперь постоянно попадает в один поток, а подсветка всегда желтая. То, что вам нужно делать, когда отладка потоков становится слишком сложной.

Короче говоря, зная, что вы отлаживаете другую тему, очень важно. Локальные переменные и трассировка стека могут быть совершенно разными.Оранжевый фон и синее восклицание предупреждают вас об этом.

Смежные вопросы