Почему рабочий поток не выполняется при отладке основного потока?

2

Я создал консольное тестовое приложение, которое создает объект и вызывает 2 функции на 2 отдельных потоках. Один поток отпечатывает числа, образующие 1- 20, в обратном порядке.

Проблема заключается в том, что при отладке 1 рабочий поток не запускается, пока я не прекращу отладку основного потока (т.е. нажмите f5). Любые ответы?

class Program
 {
  static void Main(string[] args)
   {
     DisplayData dd = new DisplayData();

     ThreadStart ts1 = new ThreadStart(dd.DisplayNumber);
     Thread t1 = new Thread(ts1);
     t1.Name = "Display Numbers";

     ThreadStart ts2 = new ThreadStart(dd.ReverseNumbers);
     Thread t2 = new Thread(ts2);
     t2.Name = "Reverse Numbers";

     t1.Start(); //Keep 1st break point at this location. Then press F10.
     t2.Start(); //Keep break point at this location permanently
    }




public class DisplayData
   {
       public void DisplayNumber()
       {
          int length = 20;
          Console.WriteLine("\nNumbers in correct order.\n");


          for (int i = 0; i < length; i++)
          {

             Console.WriteLine("DN: The value of i is: " + (i+1) + " " + Thread.CurrentThread.ManagedThreadId + " " + Thread.CurrentThread.Name);
             //Thread.Sleep(1000);

          }
       }

       public void ReverseNumbers()
       {
          int length = 20;
          Console.WriteLine("\nNumbers in reverse order.\n");
          for (int i = 0; i < length; i++)
          {

             Console.WriteLine("RN: The value of i is: " + (length - i) + " " + Thread.CurrentThread.ManagedThreadId + " " + Thread.CurrentThread.Name);
             //Thread.Sleep(1000);
          }
       }
  • 0
    Пожалуйста, посмотрите на - http://stackoverflow.com/questions/1147387/how-to-debug-a-deadlock
  • 0
    как выглядят sDisplayNumber и ReverseNumbers?
Показать ещё 2 комментария
Теги:
multithreading

4 ответа

6
Лучший ответ

Я не уверен, что это ограничение в Visual Studio или CLR, но установка точки останова на одном потоке остановит все потоки.

Если вы хотите приостановить поток, вы можете сделать это через окно Debug..Threads, вы можете приостановить и возобновить там темы.

  • 4
    Лично я не считаю ограничением то, что установка точки останова нарушает все потоки. Когда я отлаживаю многопоточный код, я хочу точно знать, какой порядок шагов происходит в этом сеансе отладки.
  • 0
    Если перейти к окну потоков -> Заморозить основной поток и нажать клавишу f5, то поток t1 выполняется, но у меня нет возможности возобновить основной поток, поскольку окно потока выходит из фокуса (пропадает, поскольку точка останова выходит из) , Следовательно, я думаю, что вышеизложенное является ответом. Это VBSStudio по умолчанию приостанавливает все потоки; который, как сказал Эндрю, хорош для отладки.
Показать ещё 1 комментарий
2

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

Используйте t1.Join(), чтобы ждать завершения рабочего потока, прежде чем продолжить.

1

Ну, он "выполняет", но не обязательно получает временный фрагмент. Когда вы один шаг через свой код, все потоки эффективно "выполняются". Однако фактическое количество работающих потоков зависит от доступных ЦП. Поэтому в зависимости от обстоятельств ваши другие потоки могут работать или не работать.

Поскольку среда .NET синхронизирует доступ к стандартным выводам, только один из ваших потоков будет удерживать данную блокировку в любое время, что может создать впечатление, что другие потоки не запускаются.

  • 0
    Другая возможность.
1

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

Но самое простое в вашей ситуации - разместить точку прерывания в первой строке DisplayNumber и ReverseNumbers, если это то, что вы специально хотите отлаживать.

  • 0
    Дело в том, что я пытался понять, как работает многопоточность. Отсюда и простой пример.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню