调试主线程时为什么工作线程不执行?

时间:2009-08-03 07:16:20

标签: c# multithreading

我创建了一个控制台测试应用程序,它创建了一个对象&在2个独立的线程上调用2个函数。 一个线程以相反的顺序打印1-20的数字。

问题是在调试第一个工作线程时没有被解雇,直到我不停止调试主线程(即我按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);
          }
       }

4 个答案:

答案 0 :(得分:6)

我不确定这是否是Visual Studio或CLR中的限制,但在一个线程上设置断点将停止所有线程。

如果你想暂停一个线程你可以通过Debug..Threads窗口执行此操作,你可以在那里暂停和恢复线程。

答案 1 :(得分:2)

在发生上下文切换之前,不会开始处理其他威胁。在CPU决定开始其他工作之前,它可以很容易地完成主程序中的所有工作。

在继续之前使用t1.Join()等待工作线程完成。

答案 2 :(得分:1)

你会发现,如果你继续单步执行主线程代码,它最终会切换到你的一个工作线程。

但在你的情况下最简单的做法是在 DisplayNumber ReverseNumbers 的第一行放置一个断点,如果这是你特别想调试的那个。

答案 3 :(得分:1)

它确实“执行”,但它不一定得到任何时间片。当您单步执行代码时,所有线程都会有效地“执行”。但是,实际运行的线程数取决于可用的CPU。因此,根据具体情况,您的其他线程可能会运行也可能不运行。

由于.NET框架会同步对标准输出的访问,因此任何时候只有一个线程会持有该锁,这可能会让您觉得其他线程不会运行。