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

问题描述:

我创建了一个控制台测试应用程序,它创建一个对象&在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); 
      } 
     } 
+0

sDisplayNumber和ReverseNumbers如何显示? – 2009-08-03 07:30:21

+0

一个问题是,当线程启动时没有确切的保证,如果你下降到t2.Start(),那么t1可能还没有启动,但是因为你在该行上暂停,所以什么都不会发生。也许如果你在t1.Start()和t2.Start()之间插入一行来检查线程是否启动,那么启动t2会更好。 – 2009-08-03 07:34:13

+0

如果在t1.Start()&t2.Start(0然后t1执行。 – 2009-08-03 07:46:15

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

如果你想暂停一个线程,你可以通过Debug..Threads窗口来完成这个任务,你可以在那里暂停和恢复线程。

在上下文切换发生之前,另一个威胁的工作不会开始。在CPU决定开始其他事情之前,可以轻松完成主程序中的所有工作。

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

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

但在你的情况,最简单的做法是将一个破发点上的 DisplayNumber ReverseNumbers第一线,如果这就是你特别要调试。

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

由于.NET框架将访问同步到标准输出,因此您的线程中只有一个线程会随时保持给定的锁定,这可能会让您感觉其他线程无法运行。