为什么在调试主线程时工作线程不能执行?
问题描述:
我创建了一个控制台测试应用程序,它创建一个对象&在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);
}
}
答
我不知道这是否是在Visual Studio或CLR的限制,但在一个线程中设置断点将停止所有线程。
如果你想暂停一个线程,你可以通过Debug..Threads窗口来完成这个任务,你可以在那里暂停和恢复线程。
答
在上下文切换发生之前,另一个威胁的工作不会开始。在CPU决定开始其他事情之前,可以轻松完成主程序中的所有工作。
使用t1.Join()
在继续之前等待工作线程完成。
答
你会发现如果你继续浏览主线程代码,它最终会切换到你的一个工作线程。
但在你的情况,最简单的做法是将一个破发点上的 DisplayNumber和 ReverseNumbers第一线,如果这就是你特别要调试。
答
那么它执行“,”但它不一定得到任何时间片。当你单步执行你的代码时,所有线程都会有效地“执行”。但是,实际运行的线程数取决于可用的CPU。所以根据情况你的其他线程可能运行也可能不运行。
由于.NET框架将访问同步到标准输出,因此您的线程中只有一个线程会随时保持给定的锁定,这可能会让您感觉其他线程无法运行。
sDisplayNumber和ReverseNumbers如何显示? – 2009-08-03 07:30:21
一个问题是,当线程启动时没有确切的保证,如果你下降到t2.Start(),那么t1可能还没有启动,但是因为你在该行上暂停,所以什么都不会发生。也许如果你在t1.Start()和t2.Start()之间插入一行来检查线程是否启动,那么启动t2会更好。 – 2009-08-03 07:34:13
如果在t1.Start()&t2.Start(0然后t1执行。 – 2009-08-03 07:46:15